出于某种原因,我需要知道对象顶点的颜色。我能想到的方法是将顶点渲染到屏幕上,然后调用 glReadPixels
从屏幕空间中获取顶点的颜色。
我的程序实现如下:
渲染第 ith 个顶点:
glPointSize(8.0); glDrawArrays(GL_POINTS, i, 1);
计算这个顶点的屏幕坐标:
oPos[3] = 1.0 // assume the object space coordinates of the vertex is oPos.
将
oPos
乘以model-view-projection矩阵得到该顶点的归一化设备坐标,表示为ndcPos
;ndcPos[1~3] /= ndcPos[3]
最后,将
ndcPos
乘以视口(viewport)矩阵得到屏幕坐标,表示为screenPos
。视口(viewport)矩阵定义为:GLfloat viewportMat[] = { screen_width/2, 0, 0, 0, 0, screen_height/2, 0, 0, 0, 0, 1, 0, (screen_width-1)/2.0, (screen_height-1)/2.0, 0, 1};
最后,调用
glReadPixels
为:glReadPixels(int(screenPos[0]+0.5), int(screenPos[1]+0.5), 1, 1, GL_RGB, GL_FLOAT, currentColor);
生成的颜色随后将存储在 currentColor 中,这是一个长度为三的 vector 。
我的问题是:
- 有没有比从屏幕空间查询顶点颜色更好的方法?
- 关于我的第二步和第三步的正确性有什么想法吗?
最佳答案
OpenGL transform feedback允许着色器将任意值写入缓冲区对象,然后主机程序可以读取该对象。您可以使用它让您的顶点着色器将计算出的顶点颜色传递回主机程序。
变换反馈的好处在于,您可以在绘制到屏幕时使用它,因此您可以绘制几何体并一次性捕获顶点颜色。或者,如果您愿意,您可以在关闭光栅化的情况下绘制几何图形,以在不触摸屏幕的情况下捕获反馈数据。
由于变换反馈产生的数据存储在缓冲区对象中,您也可以将其用作其他绘图操作的输入。根据您打算对计算出的顶点颜色执行的操作,您或许可以完全避免将它们传回宿主程序。
关于c - 从屏幕空间读取顶点颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24027938/