为什么这个 GLSL Vertex Shader 无法编译?

发布于 2024-11-25 16:58:46 字数 972 浏览 0 评论 0原文

我正在用 OpenGL 编写自己的着色器,但我很困惑为什么这个着色器无法编译。其他人可以看一下吗?

我作为顶点传递的是以下格式的 2 个浮点数(以字节分隔):

Float 1:

Byte 1: Position X
Byte 2: Position Y
Byte 3: Position Z
Byte 4: Texture Coordinate X


Float 2:

Byte 1: Color R
Byte 2: Color G 
Byte 3: Color B
Byte 4: Texture Coordinate Y

这是我的着色器:

in vec2 Data;
varying vec3 Color;
varying vec2 TextureCoords;

uniform mat4 projection_mat;
uniform mat4 view_mat;
uniform mat4 world_mat;

void main() 
{
    vec4 dataPosition = UnpackValues(Data.x);
    vec4 dataColor = UnpackValues(Data.y);

    vec4 position = dataPosition * vec4(1.0, 1.0, 1.0, 0.0);
    Color = dataColor.xyz;

    TextureCoords = vec2(dataPosition.w, dataColor.w)

    gl_Position = projection_mat * view_mat * world_mat * position;
}

vec4 UnpackValues(float value)
{
    return vec4(value % 255, (value >> 8) % 255, (value >> 16) % 255, value >> 24);
}

如果您需要更多信息,我很乐意遵守。

I'm writing my own shader with OpenGL, and I am stumped why this shader won't compile. Could anyone else have a look at it?

What I'm passing in as a vertex is 2 floats (separated as bytes) in this format:

Float 1:

Byte 1: Position X
Byte 2: Position Y
Byte 3: Position Z
Byte 4: Texture Coordinate X


Float 2:

Byte 1: Color R
Byte 2: Color G 
Byte 3: Color B
Byte 4: Texture Coordinate Y

And this is my shader:

in vec2 Data;
varying vec3 Color;
varying vec2 TextureCoords;

uniform mat4 projection_mat;
uniform mat4 view_mat;
uniform mat4 world_mat;

void main() 
{
    vec4 dataPosition = UnpackValues(Data.x);
    vec4 dataColor = UnpackValues(Data.y);

    vec4 position = dataPosition * vec4(1.0, 1.0, 1.0, 0.0);
    Color = dataColor.xyz;

    TextureCoords = vec2(dataPosition.w, dataColor.w)

    gl_Position = projection_mat * view_mat * world_mat * position;
}

vec4 UnpackValues(float value)
{
    return vec4(value % 255, (value >> 8) % 255, (value >> 16) % 255, value >> 24);
}

If you need any more information, I'd be happy to comply.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

丢了幸福的猪 2024-12-02 16:58:46

您需要在调用之前声明UnpackValues。 GLSL 就像 C 和 C++;名称在使用之前必须有声明。


顺便说一句:您尝试做的事情不会起作用。花车就是花车;除非您使用 GLSL 4.00(并且由于您继续使用“变化”等旧术语,我猜不是),否则您无法从浮点数中提取位。事实上,右移运算符仅针对整数定义;尝试在浮点数上使用它将会失败并出现编译器错误。

GLSL 不是 C 或 C++(讽刺的是)。

如果你想打包你的数据,使用OpenGL来为你打包。发送两个包含标准化无符号字节的 vec4 属性:

glVertexAttribPointer(X, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, *);
glVertexAttribPointer(Y, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, * + 4);

您的顶点着色器将采用两个 vec4 值作为输入。由于您没有使用 glVertexAttribIPointer,OpenGL 知道您正在传递将被解释为浮点数的值。

You need to declare UnpackValues before you call it. GLSL is like C and C++; names must have a declaration before they can be used.


BTW: What you're trying to do will not work. Floats are floats; unless you're working with GLSL 4.00 (and since you continue to use old terms like "varying", I'm guessing not), you cannot extract bits out of a float. Indeed, the right-shift operator is only defined for integers; attempting to use it on floats will fail with a compiler error.

GLSL is not C or C++ (ironically).

If you want to pack your data, use OpenGL to pack it for you. Send two vec4 attributes that contain normalized unsigned bytes:

glVertexAttribPointer(X, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, *);
glVertexAttribPointer(Y, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, * + 4);

Your vertex shader would take two vec4 values as inputs. Since you are not using glVertexAttribIPointer, OpenGL knows that you're passing values that are to be interpreted as floats.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文