出于某种原因,我需要知道对象顶点的颜色。我能想到的方法是将顶点渲染到屏幕,然后调用glReadPixels
从屏幕空间中获取顶点的颜色。
渲染 i th 顶点:
glPointSize(8.0);
glDrawArrays(GL_POINTS, i, 1);
计算此顶点的屏幕坐标:
oPos[3] = 1.0
// assume the object space coordinates of the vertex is oPos.
通过模型 - 视图 - 投影矩阵乘以oPos
以获得此顶点的规范化设备坐标,表示为ndcPos
;
ndcPos[1~3] /= ndcPos[3]
最后,将ndcPos
与视口矩阵相乘以获得屏幕坐标,表示为screenPos
。视口矩阵定义为:
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中,这是一个长度为3的向量。
答案 0 :(得分:2)
OpenGL transform feedback允许着色器将任意值写入缓冲区对象,然后由宿主程序读取。您可以使用它来使顶点着色器将计算出的顶点颜色传递回主机程序。
转换反馈的好处在于您可以在绘制到屏幕时使用它,因此您可以在一次通过中绘制几何和捕获顶点颜色。或者,如果您愿意,可以在关闭光栅化的情况下绘制几何图形,以捕获反馈数据而不触摸屏幕。
由于变换反馈产生的数据存储在缓冲区对象中,因此您也可以将其用作其他绘图操作的输入。根据您计划对计算的顶点颜色执行的操作,您可以避免将它们转移回主机程序。