如何使顶点着色器适应2D和3D?

时间:2014-11-19 08:27:19

标签: c++ opengl 3d 2d glsl

我正在研究2D中的粒子模拟,我需要扩展到3D。 C ++代码非常适合通过更改标志来支持2D和3D,但是,我刚刚开始学习OpenGL和着色器,并且想知道是否有一种很好的方法来使我的顶点着色器通用。

到目前为止,我的着色器看起来像

in vec3 vertexPosition;
uniform mat4 MVP;

void main()
{
   gl_Position = MVP * vec4(vertexPosition.xyz,1.0);
}

在3D中运行良好,但如果我去2D,我需要修改它。我想解决它的一种方法是只有2个不同的着色器,一个用于2D,一个用于3D,而我的旗帜在C ++中选择合适的一个,但我想知道是否有更好的方法来实现这一点,而没有两个单独的着色器文件。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您只需要将Z坐标设置为0,当您只为属性传递2个组件时,该坐标会自动发生。

请参阅openGL wiki上的顶点规范页面的Vertex format部分:

  

每个属性索引表示某种类型的向量,长度为1到4个组件。 glVertexAttribPointer函数的size参数定义属性数组提供的向量中的组件数。它可以是任何数字1-4。请注意,大小不必与顶点着色器使用的大小完全匹配。如果顶点着色器的组件少于属性提供的组件,则会忽略其他内容。如果顶点着色器的组件数多于数组提供的组件数,则为XYZW组件的向量(0,0,0,1)提供额外值。请注意,对于双精度输入(GL 4.1或ARB_vertex_attrib_64bit),具有比提供的组件更多的组件会使额外组件具有未定义的值。