2012-02-11 4 views
2

現在、Android用のアプリケーションを構築していますが、レンダリングを拒否するシェイダーでいくつかの問題が発生しています。GLSL Shaderは一様変数から色をレンダリングしません

は、次のフラグメントシェーダを検討:

uniform vec4 color; 
void main(){ 
    gl_FragColor = vec4(1.0); 
} 

このシェーダはソリッドカラー(この場合は白)でオブジェクトを描画するため正常に動作します。均一なベクトルcolorは最適化されており、glGetUniformLocation()(-1を返します)で見つけることはできません。均一な変数から色を取得しよう

がそうのように行うことができます:私はこれを使用する場合

uniform vec4 color; 
void main(){ 
    gl_FragColor = color; 
} 

しかし、何もレンダリングしません。シェーダが正常に作成され、glGetUniformLocation()が有効な値(0)を返します。しかし、画面上に何も表示されず、黒でもありません。唯一の変更は、vec4(1.0)colorに置き換えたことです。 このコードは同じ結果があります。

uniform vec4 color; 
void main(){ 
    gl_FragColor = vec4(1.0)+color; 
} 

奇妙なことは、私は別のプロジェクトでシェーダをしようとしたとき、それはそれが必要として動作するので、問題は、私はコード内の他の場所で行う何かでなければならないということです。
これは私の描画方法(色変数がシェーダでないときに、それが動作することを心に留めておく)である:誰もがいずれかを持っている場合、私は、この奇妙な行動を引き起こしている可能性がありますどのような絶対にないアイデアを持っていない

GLES20.glUseProgram(colorshader); 
GLES20.glUniform4f(colorIndex, 1, 1, 1, 1); //colorIndex is the result of glGetUniformLocation() called with the correct shader index and variable name. 

Matrix.multiplyMM(mvpMatrix, 0, vpMatrix, 0, matrix, 0); 
GLES20.glUniformMatrix4fv(matrixindex, 1, false, mvpMatrix, 0); 

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertices); 
GLES20Fix.glVertexAttribPointer(Shader.ATTRIBUTE_VERTEX, 3, GLES20.GL_FLOAT, false, 12, 0); 

GLES20.glLineWidth(width); 
GLES20.GL_UNSIGNED_SHORT, 0); 
GLES20.glDrawArrays(GLES20.GL_LINES, 0, count); 

アイデアや可能な解決策、私を助けてください。

更新:
サンプラーではありません任意の均一な変数を使用すると、この(とのみ)シェーダでは、この動作が発生しているようです。

アップデート2 glGetError()リターンエラーコード502: GL_INVALID_OPERATIONを使用します。

+0

「画面に何も表示されず、黒く表示されません。それはどこかでエラーを示唆しています。エラーをチェックしましたか? –

+0

@NicolBolas:私の考えは、シェーダの作成時に明示的なエラーが発生せず、カラーユニフォームの値を得ることができるので、プロセスの後半で間違っているはずです。残念ながら、私はこれをデバッグする方法を知らない。 'glGetError()'はおそらくコードの助けになるでしょうか? – Jave

+0

'glGetError'はあなたが使うべきものです。 –

答えて

1

わかりましたので、最終的にテストが終わった後にわかりました。私のコードで
、私は複数のシェーダを使用していたが、私は偶然だけシェーダのmvpMatrix-ユニフォームを持っていたし、funnily十分にこれを作成する前に、私が持っていたすべてのシェーダのために働いていたすべてのシェーダ、のために1つを使用していました1つ(すべての以前のシェーダにはid 0が割り当てられています)。
しかし、このシェーダでは、私の新しいvec4がid 0を持っているように見えて、コードが私のベクトルデータをmvp-matrixに間違って割り当ててしまったようです。各シェーダの新しいIDを取得することで、プログラムが機能しました。

-4

色が初期化されておらず、おそらくシェーダが異常終了する可能性があります。

+0

どのようにそれはユニット化されていますか? –

+0

colorIndexが保持している場合は、初期化されていません。しかし、私は間違っている可能性があるレンダリングコードをそのように解釈しませんでした。私はまだそれが効果を持っているかどうかを確認するためにシェーダのカラーベクトルを初期化しようとします。 – Tobias

+0

colorindexは変数の有効な値を保持しているため、正しく初期化されます。 – Jave

関連する問題