c - 从屏幕空间读取顶点颜色

标签 c opengl

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

我的程序实现如下:

  1. 渲染第 ith 个顶点:

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

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

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

    生成的颜色随后将存储在 currentColor 中,这是一个长度为三的 vector 。

我的问题是:

  1. 有没有比从屏幕空间查询顶点颜色更好的方法?
  2. 关于我的第二步和第三步的正确性有什么想法吗?

最佳答案

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

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

由于变换反馈产生的数据存储在缓冲区对象中,您也可以将其用作其他绘图操作的输入。根据您打算对计算出的顶点颜色执行的操作,您或许可以完全避免将它们传回宿主程序。

关于c - 从屏幕空间读取顶点颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24027938/

相关文章:

OpenGL 聚光灯与 Cg

c++ - 我的 OpenGL 位图程序崩溃了?

c - 交换到 ucontext_t 的 uc_link 时发生 swapcontext 段错误

c - 4.4BSD-Lite 中 m_devget 中 sizeof 的用法?

OpenGL:弃用有什么关系?

c++ - D3D11 中是否有等同于 OpenGL glVertexAttrib() 的函数?

c++ - 如何在 OpenGL 中显示/绘制 .ply 对象?

c - _Generic 和具有多个参数的函数

c - printf 如何影响 getrusage 在 C 中测量时间

c - 应用什么算法来连续重新分配小内存块?