微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不能在 GLSL 中使用多个“in”变量?

如何解决为什么我不能在 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;

它除了背景颜色外不绘制任何东西

那是因为您的着色器无法编译或链接。您应该查询 ShaderProgram info logs,并实际阅读它们。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?