2011-07-22 13 views
5

私はOpenGLを使って自分のシェーダを書いています。なぜこのシェーダがコンパイルされないのか分かりません。他の誰かがそれを見てもらえますか?GLSL Vertex Shaderはなぜコンパイルされませんか?

私は何を頂点として渡していることは、この形式の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); 
} 

あなたがこれ以上必要な場合情報、私は喜んで遵守するだろう。

+0

エラーメッセージを貼り付けてコピーしてください。 – tibur

+0

エラーメッセージはどのように表示されますか?私はglGetProgramInfoLogを呼び出すときに1つを取得しますが、それはちょうどglLinkProgram()が呼び出される前に「頂点シェーダが正常にコンパイルされませんでした。 – Azzi777

+3

@ Azzi777:glCompileShaderが失敗したときに動作するglGetShaderInfoLogがあります。 _常にシェーダオブジェクトとプログラムオブジェクトのコンパイルステータスをチェックする必要があります。 –

答えて

10

UnpackValuesの前にと呼ぶ必要があります。 GLSLはCやC++に似ています。名前を宣言する必要があります。


ところで:あなたが何をしようとしてを動作しません。浮きは浮きです。 GLSL 4.00で作業している場合を除いて(そして、 "変化する"のような古い用語を使い続けているので、私は推測していません)、浮動小数点数からビットを抽出することはできません。実際、右シフト演算子は整数に対してのみ定義されています。フロートで使用しようとすると、コンパイラエラーが発生して失敗します。

GLSLはCまたはC++(皮肉にも)ではありません。

データをパックする場合は、OpenGLを使用してデータをパックします。

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

あなたの頂点シェーダーが入力として2つのvec4の値を取る:正規化された符号なしバイトを含む2つのvec4属性を送信します。 glVertexAttrib Iポインタを使用していないので、OpenGLは浮動小数点として解釈される値を渡していることを知っています。

+0

ありがとう、シェイダーは今コンパイルします。私はglGetVertexAttributeにいくつか問題があります。どの順序でglGenBuffer、glBindBuffer(glSetDataを呼びますか?)を呼び出す必要があります。また、頂点データを実際にシェーダに転送するために必要なものは何ですか?事前に感謝します – Azzi777

+0

@ Azzi777:あなたが引用した関数の多く( 'glGetVertexAttribute'、' glSetData')は存在しません。あなたの元の質問に答えられたようです。頂点データを送信する方法について質問がある場合は、新しい質問としてそれを質問する必要があります。 –

関連する問題