C语言 从屏幕空间读取顶点颜色



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

我的程序实现如下:

  1. 渲染<一口> 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的向量。

我的问题是:
  1. 有更好的方法来获得顶点颜色,而不是从屏幕空间查询它们?
  2. 关于我的第二步和第三步的正确性有什么想法吗?

OpenGL转换反馈允许着色器将任意值写入缓冲区对象,然后由宿主程序读取。你可以使用这个来让你的顶点着色器将计算的顶点颜色传递回宿主程序。

变换反馈的好处是,你可以在绘制屏幕时使用它,所以你可以绘制几何体在一个通道中捕获顶点颜色。或者,如果你愿意的话,你可以在关闭栅格化的情况下绘制几何图形,以便在不触摸屏幕的情况下捕获反馈数据。

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

最新更新