5

OpenGL を使用して独自のシェーダーを作成していますが、このシェーダーがコンパイルされない理由がわかりません。他の誰かがそれを見ることができますか?

頂点として渡すのは、次の形式の 2 つの float (バイト単位で区切られたもの) です。

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);
}

さらに情報が必要な場合は、喜んで対応させていただきます。

4

1 に答える 1

10

呼び出すUnpackValues に宣言する必要があります。GLSL は C や C++ に似ています。名前は、使用する前に宣言する必要があります。


ところで:あなたがやろうとしていることはうまくいきません。フロートはフロートです。GLSL 4.00 を使用していない限り (「可変」などの古い用語を使用し続けているため、そうではないと思います)、float からビットを抽出することはできません。実際、右シフト演算子は整数に対してのみ定義されています。float で使用しようとすると、コンパイル エラーで失敗します。

GLSL は C や C++ ではありません (皮肉なことに)。

データをパックする場合は、OpenGL を使用してパックします。正規化された符号なしバイトを含む 2 つの vec4 属性を送信します。

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

頂点シェーダーはvec4、入力として 2 つの値を受け取ります。glVertexAttrib I Pointer を使用していないため、OpenGL は、float として解釈される値を渡していることを認識しています。

于 2011-07-22T02:24:34.377 に答える