从屏幕空间读取顶点颜色

时间:2014-06-04 02:14:09

标签: c opengl

出于某种原因,我需要知道对象顶点的颜色。我能想到的方法是将顶点渲染到屏幕,然后调用glReadPixels从屏幕空间中获取顶点的颜色。

我的程序实现如下:

  1. 渲染 i th 顶点:

    glPointSize(8.0);
    glDrawArrays(GL_POINTS, i, 1);
    
  2. 计算此顶点的屏幕坐标:

    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};
    
  3. 最后,将glReadPixels称为:

    glReadPixels(int(screenPos[0]+0.5), int(screenPos[1]+0.5),
        1, 1, GL_RGB, GL_FLOAT, currentColor);
    

    然后,生成的颜色将存储在currentColor中,这是一个长度为3的向量。

  4. 我的问题是:

    1. 有没有更好的方法来获取顶点颜色而不是从屏幕空间查询它们?
    2. 关于我的第二步和第三步的正确性的任何想法?

1 个答案:

答案 0 :(得分:2)

OpenGL transform feedback允许着色器将任意值写入缓冲区对象,然后由宿主程序读取。您可以使用它来使顶点着色器将计算出的顶点颜色传递回主机程序。

转换反馈的好处在于您可以在绘制到屏幕时使用它,因此您可以在一次通过中绘制几何捕获顶点颜色。或者,如果您愿意,可以在关闭光栅化的情况下绘制几何图形,以捕获反馈数据而不触摸屏幕。

由于变换反馈产生的数据存储在缓冲区对象中,因此您也可以将其用作其他绘图操作的输入。根据您计划对计算的顶点颜色执行的操作,您可以避免将它们转移回主机程序。