【发布时间】:2019-04-29 16:32:17
【问题描述】:
我有一个服务器,它使用带有自定义帧缓冲区的 OpenGL 渲染网格。在我的片段着色器中,我将gl_primitiveID 写入输出变量。之后我打电话给glReadPixels 来读取 ID。然后我知道渲染了哪些三角形(因此可见),然后我将所有这些三角形发送到在 Unity 上运行的客户端。在这个客户端上,我将顶点和索引数据添加到GameObject,它可以毫无问题地渲染它。除非我开始缩小,否则我在 Unity 中得到的渲染结果与使用 OpenGL 得到的渲染结果完全相同。
我的第一个想法是我有不同的分辨率,但事实并非如此。我在服务器和客户端上都有 1920*1080。我在服务器上使用来自客户端的相同视图和投影矩阵,所以这也不应该是问题。这个错误可能是什么原因?
如果你需要看我写的一些代码。
这是我的顶点着色器代码:
#version 330 core
layout (location = 0) in vec3 position;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * vec4(position, 1.0f);
}
这是我的片段着色器代码:
#version 330 core
layout(location = 0) out int primitiveID;
void main(void)
{
primitiveID = gl_PrimitiveID + 1; // +1 because the first primitive is 0
}
这是我的getVisibleTriangles 方法:
std::set<int> getVisibleTriangles() {
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(0, 0, SCR_WIDTH, SCR_HEIGHT, GL_RED_INTEGER, GL_INT, &pixels[0]);
std::set<int> visibleTriangles;
for (int i = 0; i < pixelsLength; i += 4) {
int id = * (int*) &pixels[i];
if (id != 0) {
visibleTriangles.insert(id-1); // id 0 is NO_PRIMITIVE
}
}
return visibleTriangles;
}
【问题讨论】:
-
您是否启用了任何类型的抗锯齿功能?在可能影响每个像素抓取哪个三角形的服务器上。
-
如果 OpenGL 默认不做任何抗锯齿,就不应该做,但我也会检查一下,谢谢你的提示。
-
好的,所以我检查了这个并没有启用多重采样。
标签: unity3d opengl rendering resolution