gpt4 book ai didi

c++ - GLSL:如何访问附近的顶点颜色? (没有制服的双线性插值)

转载 作者:太空狗 更新时间:2023-10-29 20:47:32 24 4
gpt4 key购买 nike

我正在尝试在四边形上进行双线性颜色插值,我在我之前的问题的帮助下成功了,但它的性能很差,因为它需要我重复 glBegin() 和 glEnd() 以及 4 次 glUniform () 在 glBegin() 之前。

问题是:是否可以像这样在四边形上应用双线性颜色插值:

glBegin(GL_QUADS);
glColor4f(...); glVertexAttrib2f(uv, 0, 0); glTexCoord2f(...); glVertex3f(...);
glColor4f(...); glVertexAttrib2f(uv, 1, 0); glTexCoord2f(...); glVertex3f(...);
glColor4f(...); glVertexAttrib2f(uv, 1, 1); glTexCoord2f(...); glVertex3f(...);
glColor4f(...); glVertexAttrib2f(uv, 0, 1); glTexCoord2f(...); glVertex3f(...);
... // here can be any amount of quads without repeating glBegin()/glEnd()
glEnd();

要做到这一点,我想我应该以某种方式访问​​附近的顶点颜色,但是如何访问呢?或者还有其他解决方案吗?

我需要它以这种方式工作,以便我可以轻松地在不同的插值着色器之间切换。

使用一个 glBegin() 命令的任何其他解决方案也很好,但是发送每个顶点的所有角颜色是 Not Acceptable ,除非那是这里唯一的解决方案?

编辑:示例代码使用即时模式只是为了清楚起见。即使使用顶点数组/缓冲区,问题也是一样的:我必须将渲染调用拆分为 4 个顶点 block ,这会导致此处整体速度下降!

最佳答案

长话短说:您不能使用顶点着色器执行此操作。

插值器(或光栅化器)是图形管线中不可编程的组件之一。考虑到图形管道的工作方式,出于速度、简单性和并行性的原因,顶点着色器和片段着色器都不允许访问除它们的顶点(或片段)以外的任何内容。

解决方法是使用纹理查找,这在之前的回答中已经提到。

在较新版本的 OpenGL(我相信是 3.0 或更高版本?)中,现在有几何着色器的概念。几何着色器比相对简单的顶点和片段着色器实现起来更复杂,但是几何着色器被赋予了拓扑信息。也就是说,它们在图元(三角形、直线、四边形等)而不是单个点上执行。有了这些信息,他们可以创建额外的几何图形来解决您的替代颜色插值方法。

然而,这远比必要的复杂。我会坚持使用 4 纹素纹理贴图并在您的片段查找中实现您的逻辑。

关于c++ - GLSL:如何访问附近的顶点颜色? (没有制服的双线性插值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5396440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com