如何解决为什么我不能在 GLSL 中使用多个“in”变量?
考虑我的着色器程序。
const char* vert_shader_script =
"#version 330 core\n \n\
\n\
layout(location = 0) in vec3 vertex_pos; \n\
layout(location = 1) in vec2 texture_uv; \n\
\n\
uniform mat4 M,V,P; \n\
\n\
out vec2 uv; \n\
\n\
void main() { \n\
\n\
gl_Position = P * V * M * vec4(vertex_pos,1.0); \n\
uv = texture_uv; \n\
}\n";
const char* frag_shader_script =
"#version 330 core \n\
\n\
uniform sampler2D texture0; \n\
uniform vec4 override_color; \n\
uniform vec2 player_pos; \n\
\n\
in vec2 uv; \n\
in int gl_VertexID; // This causes it! \n\
\n\
out vec4 out_col; \n\
\n\
void main() { \n\
\n\
vec4 tex_color = texture2D(texture0,uv); \n\
float alpha = 1.0; \n\
\n\
if (tex_color.r == 1.0 && tex_color.g == 0.0 && tex_color.b == 1.0) \n\
alpha = 0.0; \n\
else { \n\
\n\
if (override_color.a > 0.0) \n\
tex_color = override_color; \n\
else { \n\
\n\
tex_color.r = max(tex_color.r - 0.9,0.1); \n\
tex_color.g = max(tex_color.g - 0.9,0.1); \n\
tex_color.b = max(tex_color.b - 0.9,0.1); \n\
} \n\
} \n\
\n\
out_col = vec4(tex_color.r,tex_color.g,tex_color.b,alpha); \n\
}\n";
一切正常,直到我在片段着色器中添加了 in int gl_VertexID
。除了背景颜色之外什么都没有被绘制。它不仅在我使用 gl_VertexID
时发生,而且即使当我尝试在 in
下方添加我自己的 uv
变量时,它也会发生。我试图通过在顶点着色器中创建一个新的 vertex_pos
来将 out pos
从顶点着色器传递到片段着色器,在片段着色器中创建 in pos
然后在之前的顶点着色器中更改它它被发送到片段着色器。但是,在片段着色器中添加另一个 in
变量后立即出现问题。
我一次只能使用一个吗?这里是否发生了其他事情,例如我的 C++ 代码中缺少 gl 函数?我目前在渲染之前和渲染时使用的唯一内容是:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthFunc(GL_LESS);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
即使除了第一个没有它们,问题仍然存在。
编辑:顶点着色器和片段着色器的日志中都没有错误/警告消息。
更新:
我已将 gl_VertexID
从片段着色器重新定位到顶点着色器,并解决了我将来可能遇到的任何可能问题。但是,我注意到我当前的问题实际发生的时间,但不知道为什么。
考虑更新的着色器:
// Vertex Shader
...
in int gl_VertexID;
out int vert_id;
void main() {
...
vert_id = gl_VertexID;
}
// Fragment Shader
...
in int vert_id;
void main() {
...
if (vert_id == 0) {
// Empty statement for testing purposes.
}
else {
// This statement is empty as well.
}
...
// Draw normally. Apply regular data to the out_color vector. nothing else has been changed nor prevents the code from reaching the declaration. But doesn't it really?
}
问题在于 vert_id 变量的分配。如果我要保留顶点着色器主函数中除 vert_id = gl_VertexID
之外的所有内容,则不会发生该问题,但只要我为 vert_id 赋予任何值,它就不会绘制除背景颜色之外的任何内容。这可能发生在我检查片段着色器时,主要是 if (vert_id == N)
,因为在删除它而不是顶点着色器中的分配时,问题不会持续存在。我在这里做错了什么?日志中仍然没有报告错误。
解决方法
所有以 gl_
开头的标识符都是为 GLSL 规范保留的。你不能重新发明它们。您可以重新声明其中的一些,但前提是它们在着色器阶段已经以某种形式存在。
简而言之:
直到我在片段着色器中添加了 in int gl_VertexID
gl_VertexID
是一个 built-in variable,用于定义特定输入顶点来自哪个顶点索引。由于片段着色器处理片段而不是顶点,因此该变量在 FS 中不可用(片段由图元生成,可以从 多个 顶点构建。因此您不知道要获取哪个顶点索引来自)。如果您想将某种标识符传递给 FS,您将不得不让您的 VS 提供该数据。
没有对整数类型的插值支持。因此,如果要将整数值转发到片段着色器,则必须使用 flat
插值限定符:
VS:
flat out int vert_id;
FS:
flat in int vert_id;
它除了背景颜色外不绘制任何东西
那是因为您的着色器无法编译或链接。您应该查询 Shader 和 Program info logs,并实际阅读它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。