OpenGL着色器节点编辑器

时间:2017-10-24 17:52:37

标签: opengl glsl shader fragment-shader vertex-shader

我正在开发一个非常类似于Unreal或Unity的素材编辑器,但我遇到了困难。我不知道如何实现最重要的代码:如何将图表/节点转换为glsl,所以我有一些问题:

  • 顶点着色器是否包含恒定数量的属性?例如:位置,纹理坐标,法线,切线,比特根和所有光信息,或者它取决于我在材质中的节点,例如法线贴图节点。
  • 图表更改后,是否只需要更改片段着色器代码或顶点/片段着色器代码或几何/片段/顶点着色器代码?

1 个答案:

答案 0 :(得分:2)

在设置此类任务之前,您应该首先学习现代OpenGL。以下是您的问题的简要回答。对于“深入”信息,请抓取一些good OpenGL book并阅读。

  

顶点着色器是否包含恒定数量的属性?

不。它取决于用户。根据您的缓冲区配置,您可能需要positionnormalsuv attrbutes - 如果您需要执行纹理和法线贴图。在其他情况下,如果您只需要绘制几何图形,则可能只需要position。允许的最大属性数量取决于硬件,您可以使用GL_MAX_VERTEX_ATTRIBS标记进行查询。

  

我是否只需更改片段着色器代码或顶点/片段   图表后的着色器代码或几何/片段/顶点着色器代码   改变?

这取决于。有一些名为varyings的特殊变量。这些用于将数据从一个着色器阶段传递到另一个着色器阶段。例如,这里有一个简单的着色器程序源,用于绘制纹理贴图几何图形:

顶点着色器:

 #version 430 core
 layout(location = 0) in vec4 position;
 layout(location = 1) in vec2 uv;
 out smooth vec2 v_uv;
 void main()
 {
   gl_Position = position;//we don't do any projection
   v_uv = uv; //send interpolated uvs to fragment shader
 }

片段着色器:

 #version 430 core
 layout(binding = 1) uniform sampler2D tex;
 in smooth vec2 v_uv;
 out vec4 o_color;
 void main()
 {
    o_color= texture(tex,v_uv);
 }

正如您所看到的,我们使用uv关键字将out属性传递给片段着色器,该关键字将此变量标记为变化。在您的情况下,如果有人使用您的编辑器,则为顶点着色器添加变量,然后他们还必须在片段着色器中添加变化的in版本。希望我回答你的问题。