我正在开发一个非常类似于Unreal或Unity的素材编辑器,但我遇到了困难。我不知道如何实现最重要的代码:如何将图表/节点转换为glsl,所以我有一些问题:
答案 0 :(得分:2)
在设置此类任务之前,您应该首先学习现代OpenGL。以下是您的问题的简要回答。对于“深入”信息,请抓取一些good OpenGL book并阅读。
顶点着色器是否包含恒定数量的属性?
不。它取决于用户。根据您的缓冲区配置,您可能需要position
,normals
,uv
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
版本。希望我回答你的问题。