繁体   English   中英

OpenGL Shader变量传递

[英]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中没有看到这样的功能...

因此,总结一下,这是我的问题:

  1. 您使用layout(location = ...)指定了什么效果,有关着色器有什么后果?

  2. 各个着色器阶段之间的值匹配/关联如何工作? 有没有那个“ location =“?

  3. 调试glsl着色器

默认情况下,输入和输出在接口之间按名称匹配。 对于顶点着色器输入,默认的索引“自动”分配是任意的 ,这在各个实现之间可能有所不同。

layout限定符允许显式指定存储类型和输入\\输出的位置。 由于顶点输入的自动分配是任意的,你应该使用layout在GLSL或功能定位glBindAttribLocation​保证苹果苹果和桔子桔子。

因此, layout规范在顶点着色器中非常常见。 但是它可以在任何接口之间使用。 例如,如果您没有对vec4float使用相同的名称,您将可以完成

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM