c - OpenGL 着色器变量传递

标签 c opengl shader

我阅读了很多关于将 vector 和矩阵等值从顶点着色器阶段传递到片段着色器的文章和帖子。但我仍然不确定这一点: 如果您在顶点着色器中有一些输出变量(我称他为 vtxs),在片段着色器(frgs)中有一些变量,OpenGl 如何关联它们以便它们引用相同的值(我忽略了值传递的事实到 frgs 被插值)?我必须按某种顺序写下来吗?如果我这样写,OpenGl 如何解释这些变量:

vtxs:

out float x;
out vec4 mvp;

frgs:

in vec4 mvp;
in float x;
in double newvar;

注意:我打乱了 var 类型,frgs 中的 var 和 vtxs 中的 out var 多了 1 个。

我看到布局列表中的位置规范是分配...地址的一种方式? ... 到一个变量,但我有一个古老的上网本不支持这样的变量装饰器。

作为提示:您知道某种调试着色器吗?我的意思是,在 cpu 程序中你可以添加一些 printfs 但我没有在 glsl 中看到这样的函数......

所以,总结一下,这是我的问题:

  1. 你到底用 layout(location=...) 指定了什么关于着色器的结果?

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

  3. 调试 glsl 着色器

最佳答案

默认情况下,输入和输出在接口(interface)之间按名称匹配。对于顶点着色器输入,索引的默认“自动”分配是 arbitrary ,从某种意义上说,它可能因实现而异。

layout 限定符允许明确指定输入\输出的存储类型和位置。由于顶点输入的自动分配是任意的,您应该使用 GLSL 中的 layout 位置或函数 glBindAttribLocation 来保证苹果是苹果,橙子是橙子。

所以 layout 规范在顶点着色器中很常见。但它可以在任何接口(interface)之间使用。例如,如果您没有为 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);
}

你也可以

关于c - OpenGL 着色器变量传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35414760/

相关文章:

c - 如何测量 C 中的函数堆栈使用情况?

c++ - 如何从 operator new 或 malloc 为 mremap 获取页对齐内存

opengl - 理解 glPushMatrix() 和 glPopMatrix()

javascript - 固定位置着色器背景在 Three.js 中?

c++ - GLSL 照明作为平面 - 法线问题?

opengl - GPU 手动 Mipmap 生成 [OpenGL 2.x]

c - 从 C 中的列表中取消引用结构中的变量

c - 是否可以在 gcc 纯 C 中取消 const typeof?

c++ - 在 Windows 7 的 CodeBlocks 16.01 中构建 glfw3 程序失败

opengl - glBlitFramebuffer 导致访问冲突