哪些 OpenGL 函数在顶点着色器之前修改顶点位置?

Posted

技术标签:

【中文标题】哪些 OpenGL 函数在顶点着色器之前修改顶点位置?【英文标题】:What OpenGL functions modify vertex positions prior to the vertex shader? 【发布时间】:2019-05-21 20:03:59 【问题描述】:

假设有一个 1000 像素宽、500 像素高的颜色渲染纹理。我在四个角上绘制了一个四边形,(-1, -1, 0)(1, -1, 0)(-1, 1, 0)(1, 1, 0) 没有在顶点着色器中进行任何转换。

假设在这个唯一的绘制命令之前没有调用其他 GL 函数,这是否会默认覆盖整个纹理的表面?

哪些 OpenGL 函数(修改顶点位置)会导致这个四边形不再填满屏幕?

(我试图了解如何在顶点着色器之前弄乱顶点,因此我可以避免或使用正确的函数来始终映射它们,以便 NDC (-1, -1)(1, 1) 代表整个表面)。

编辑:如果位置没有改变,那么我也想知道如何在顶点着色器之前修改它们到渲染缓冲区的映射。例如,(-1, -1, 0) 是否可靠地引用渲染缓冲区左下角的片段,(0, 0, 0) 指向中间,(1, 1, 0) 指向右上角?

【问题讨论】:

您到底观察到了什么?它没有填满整个屏幕或者你什么都看不到?请注意,z 坐标为 0。如果您使用深度测试,这可能会丢弃片段。 @Gilles-PhilippePaillé - 没有深度/模板测试,我主要是问这样我才能理解 OpenGL 如何在完全着色器之前修改位置,这样我就可以编写我的相机/绘图代码更多故意地。 (现在主要是“它以某种方式工作”) 好的,我明白了。不,没有任何东西可以修改 VBO 和顶点着色器开始之间的顶点坐标。您发送的数据就是您收到的数据。 @Gilles-PhilippePaillé - 噢,我明白了!这就说得通了。我已经编辑了这个问题,还询问如何将这些位置绘制到顶点着色器之外的不同片段位置或完全裁剪 @AnneQuinn "例如,(-1, -1, 0) 是否会可靠地引用渲染缓冲区左下角的片段,(0, 0, 0)中间,以及 (1, 1, 0) 到右上角?” 标准化设备坐标到帧缓冲区的映射由视口 (glViewport) 定义。 (-1, -1) 是视口矩形的左下角, (1, 1) 是右上角。 【参考方案1】:

“在顶点着色器之前”顶点数据不会发生任何事情。它不会发生任何事情,因为 OpenGL 不知道顶点属性 的含义 是什么。它不知道属性 2 指的是什么;它不知道什么是位置、法线、纹理坐标或任何东西。就 OpenGL 而言,这一切都只是数据。赋予该数据意义的是您的顶点着色器。并且只能以您的顶点着色器定义的方式。

根据您的 VAO 指定的格式读取来自缓冲区对象的数据,并提供给处理这些顶点的顶点着色器调用。

【讨论】:

以上是关于哪些 OpenGL 函数在顶点着色器之前修改顶点位置?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上的 VBO 值?

OpenGL学习随笔-- 顶点着色器(VertexShader)

Python之OpenGL笔记(5):OpenGL着色器语言(GLSL)应用画三角形

✠OpenGL-13-几何着色器

在顶点着色器中更改顶点的颜色

OpenGL - 动画是由着色器完成的吗?