[英]OpenGL Shader variable passing
我读过许多文章和帖子,内容涉及从顶点着色器阶段到片段着色器的传递值,例如向量和矩阵。 但是我仍然不确定:如果您在顶点着色器中有一些变量(我称他为vtxs),而在片段着色器中有一些变量(frgs),那么OpenGl如何将它们关联起来,以便它们引用相同的值(我忽略了传递给frg的值是插值的事实)? 我必须按一定顺序写下来吗? 如果我这样写,OpenGl如何解释这些变量:
vtxs:
out float x;
out vec4 mvp;
frgs:
in vec4 mvp;
in float x;
in double newvar;
注意:我改组了var类型,在frgs中的var中有1个,在vtxs中的vars中还有1个。
我看到布局列表中的位置规范是一种分配...地址的方法? ...到一个变量,但是我有一个古老的上网本不支持这种变量装饰器。
还有一个提示:您知道某种调试着色器吗? 我的意思是,在cpu程序中可以添加一些printfs,但是我在glsl中没有看到这样的功能...
因此,总结一下,这是我的问题:
您使用layout(location = ...)指定了什么效果,有关着色器有什么后果?
各个着色器阶段之间的值匹配/关联如何工作? 有没有那个“ location =“?
调试glsl着色器
默认情况下,输入和输出在接口之间按名称匹配。 对于顶点着色器输入,默认的索引“自动”分配是任意的 ,这在各个实现之间可能有所不同。
layout
限定符允许显式指定存储类型和输入\\输出的位置。 由于顶点输入的自动分配是任意的,你应该使用layout
在GLSL或功能定位glBindAttribLocation
保证苹果苹果和桔子桔子。
因此, layout
规范在顶点着色器中非常常见。 但是它可以在任何接口之间使用。 例如,如果您没有对vec4
和float
使用相同的名称,您将可以完成
vtxs:
layout(location = 0) out float x;
layout(location = 1) out vec4 mvp;
frgs:
layout(location = 0) in float y;
layout(location = 1) in vec4 pvm;
现在,接口中不存在的任何输入都将中断管道。 如果您使用新变量
in double newvar;
那么glLinkProgram
将失败。
调试:调试的第一步是检查状态着色器的编译和链接。 失败时,可以使用glGetShaderInfoLog
检索错误。
//compilation
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if(!success)
{
GLchar infoLog[512];
glGetShaderInfoLog(shader, 512, NULL, infoLog);
}
//program
glLinkProgram(shaderProgram);
GLint success;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success)
{
GLchar infoLog[512];
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
}
你也可以
默认情况下,阶段之间的变量按名称匹配。
对于位置,您可以从概念上将阶段之间传递的数据视为vec4数组。 然后location是我们用来传递该变量的数组的索引。
大于vec4的类型将获得多个连续位置。 对于较新的opengl版本(或ARB_enhanced_layouts),它们也是组件布局限定符,用于将值更紧密地打包在该vec4数组中。
我不确定按名称和位置进行匹配时如何分配位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.