我开始学习OpenGL(3.3+),现在我正在尝试在屏幕上随机绘制10000点的算法。 问题是我不知道该算法到底在哪里。因为它们是随机的,所以我不能在VBO上声明它们(或者我可以?),所以我在考虑将一个统一值传递给具有变化位置的顶点着色器(我会做一个循环来改变统一值) )。然后我会做10000次操作。我还会将一个随机颜色值传递给着色器。
这是我的一种:
#version 330 core
uniform vec3 random_position;
uniform vec3 random_color;
out vec3 Color;
void main() {
gl_Position = random_position;
Color = random_color;
}
通过这种方式,我可以在着色器之外进行计算,并将它们传递给制服,但我认为更好的方法是在顶点着色器中进行此计算。那是对的吗?
答案 0 :(得分:1)
将为传递到顶点着色器阶段的每个顶点调用顶点着色器。每个呼叫的制服都是相同的。因此,你不应该将顶点 - 无论是随机的还是不是 - 作为制服传递。如果你有全局变换(即相机旋转,模型矩阵等),那些就会进入制服。
您的顶点应作为顶点缓冲区对象传递。只需在主机应用程序中随机生成它们并绘制它们。它将自动成为着色器的变量。
您可以在每次迭代中更改数组,但是保持大小不变可能是个好主意。为此,传递具有4维的3D矢量有时是有用的,如果使用顶点则为1,否则为0。这样您就可以简单地检查是否应该绘制顶点。
然后在更新屏幕之前清除GL_COLOR_BUFFER_BIT
并绘制数组。
在着色器中,只需使用gl_Position
变量(即顶点)设置in
并将颜色传递给片段着色器 - 它将不会应用于顶点着色器。
在片段着色器中,最后一个设置变量将是颜色。所以只需使用从顶点着色器传递的变量,例如gl_FragColor
。
顺便说一下,如果你画出GL_POINTS
的东西,它会产生小方块。有很多技巧可以使它们实际上是圆的,最容易使用的可能就是在片段着色器中使用这个简单的if
。但是,您应该将它们配置为Point Sprites(glEnable(GL_POINT_SPRITE)
)然后。
if(dot(gl_PointCoord - vec2(0.5,0.5), gl_PointCoord - vec2(0.5,0.5)) > 0.25)
discard;
我建议你先阅读一下片段和顶点着色器的作用,顶点和片段是什么以及它们各自的输入/输出/均匀变量代表什么。
由于具有完整顶点缓冲对象,着色器程序等的程序变得非常庞大,您也可以从glBegin()
和glEnd()
开始直接绘制顶点。然而,这应该只是一个非常早期的起点,以了解您在绘制不同着色器影响它的位置和方式。
lighthouse3d教程(http://www.lighthouse3d.com/tutorials/)通常是一个好的开始,虽然它们可能有点过时。另外一个很好的参考是glsl wiki(http://www.opengl.org/wiki/Vertex_Shader),它在大多数情况下是最新的 - 但它可能有点技术性。 无论您是使用C ++,Java还是其他语言 - OpenGL的概念通常是相同的,因此几乎所有教程都能很好地完成。