【发布时间】:2016-09-02 06:54:30
【问题描述】:
我实现了一个应用程序,它简单地从相机视图中渲染多边形网格的深度。
在顶点着色器中,gl_Position 是使用如下简单代码设置的。
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
在片段着色器中,返回的颜色值定义如下。
color = vec3(1-gl_FragCoord.z,1-gl_FragCoord.z,1-gl_FragCoord.z);
渲染单帧后,像素值被读取为浮点数并保存为 *.pgm 图像文件。
float* pgmBuffer = new float[width*height * 3];
glReadPixels((GLint)0, (GLint)0,
(GLint)width, (GLint)height,
GL_RGB, GL_FLOAT, pgmBuffer);
WritePGM(width, height, pgmBuffer, imgname);
WritePGM 的实现如下所示。目标和源索引方程用于将 glReadPixel 结果的缓冲区顺序转换为 PGM 文件格式。 像素值 [0,1] 也被转换为 [0,255]。
void OpenGL_Render::WritePGM(int width, int height, float* buffer, char* outPGM)
{
int* gbuffer = new int[width*height];
unsigned char *cbuffer = new unsigned char[width*height*sizeof(unsigned char)];
int line = 1;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
int target = i*width + j;
int source = width*height * 3 - (((i+1)*width - (j+1)) * 3);
cbuffer[target] = buffer[source]*255;
}
}
ofstream fout(outPGM);
fout << "P5\n" << width << " " << height << "\n255\n";
fout.write((char *)cbuffer, width*height * sizeof(unsigned char));
fout.close();
}
这就是问题所在。当我打开结果 PGM 图像并观察像素值时,我发现在多边形网格的边缘,有一些像素值介于邻居的最小值和最大值之间,如下面的屏幕截图所示。在这里,我的意思是边缘作为多边形网格的轮廓或轮廓。
我的问题是,
我猜这些中间值是从 GPU 的插值器生成的。这样对吗?仅供参考,我没有使用任何其他片段着色器,例如消除锯齿。
如果正确,如何删除或禁用插值?
如果是错误的,这些中间值的原因是什么?
【问题讨论】: