OpenGL修复了管线渲染颜色GL_FLOAT不够精确的问题

46scxncf  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(154)

我正在使用OpenGL固定管线渲染3D模型,其中顶点用GL_FLOAT RGB值编码。下面是Wavefront OBJ格式的顶点数据示例:

v -705.39 31.35 82.34 0.9780448 0.9807401 0.1518212
v -705.19 30.53 81.32 0.9780985 0.9799018 0.1514152
v -706.78 32.83 87.36 0.9776751 0.9822390 0.1538261
v -706.73 32.60 86.36 0.9776898 0.9820088 0.1534263
v -706.65 32.29 85.36 0.9777099 0.9816957 0.1530257
v -706.55 31.87 84.35 0.9777372 0.9812685 0.1526239

其中以“v”开始的每一行是顶点,接着是其3D位置坐标,然后是其在范围[0,1]中的RGB值。
下面是呈现代码的片段:

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(ww, wh); // Viewport is ww by wh in dimensions
glutInitWindowPosition(0, 0);
glutCreateWindow("Rendered");

glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glShadeModel(GL_SMOOTH);

glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluPerspective(vfov, (GLdouble)ww / (GLdouble)wh, 500, 5000);
gluLookAt(cam_x, cam_y, cam_z, centre_x, centre_y, centre_z, up_x_norm, up_y_norm, up_z_norm);

display_object(); // Generates GL_TRIANGLES

// Read out colour pixels 
cv::Mat output_img(wh, ww, CV_32FC3);

glReadPixels(0, 0, ww, wh, GL_RGB, GL_FLOAT, (GLvoid *)output_img.data);

在检查output_img的某些非零条目时,它们显示如下:

0.003922 0.556863 0.525490
0.003922 0.552941 0.525490
0.003922 0.552941 0.525490
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.552941 0.521569
0.003922 0.549020 0.517647
0.003922 0.549020 0.517647
0.003922 0.549020 0.517647
0.003922 0.549020 0.517647
0.003922 0.549020 0.517647
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.552941 0.521569
0.007843 0.552941 0.521569
0.007843 0.552941 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569
0.007843 0.549020 0.521569

由于固定管道中的中间精度不足,似乎存在相同颜色的多个条目。
计算渲染颜色值以达到更高精度所需的设置是什么?

u3r8eeie

u3r8eeie1#

片段的颜色存储在帧缓冲区中。Default Framebuffer的格式(可能)是每个颜色通道1个字节。因此,当您从缓冲区读取颜色时,使用哪种类型并不重要。当颜色被写入缓冲区时,精度会丢失。
如果要以更高的精度存储颜色,则必须呈现为Framebuffer,它使用RenderbufferTexture,其格式可以以更高的精度存储值。
请参阅Image Format
如果你想渲染到一个帧缓冲区,那么我建议阅读一个教程,如FramebuffersRender To Texture分别Khronos wiki -帧缓冲区对象扩展示例。

pbgvytdp

pbgvytdp2#

这里明显的建议是使用带有32位浮点RGB颜色目标的FBO(而不是依赖于默认帧缓冲器所使用的每通道8位默认值)。

相关问题