2012-05-01 12 views
2

編集:申し訳ありませんが、スタックオーバーフローが、私は遅れています。 frac(tex_offset) - >fract(tex_offset)となり、ATIカードやnVidiaカードでも正しく動作します(#versionを指定した場合)。これは、私が知っているプログラマーのほとんどが髪が残っていない理由です。GLSL fragシェーダ - 非標準コードのnVidiaでのみ動作しますか?

-

私は学校プロジェクトのゲームに取り組んでいます。これは垂直スクロール機なので、必要な機能の1つはスクロールバックグラウンドでした。 (これは私はシェーダプログラミングに触れて初めてなので、本当に私がやっているかわからない)私はいくつかのアプローチを試みたが、私は最終的に、単純なフラグメントシェーダを書いた:

uniform sampler2D tex; 
uniform float tex_offset; 

void main() 
{ 
    vec2 coords = vec2(gl_TexCoord[0].s, gl_TexCoord[0].t - frac(tex_offset)); 
    gl_FragColor = texture2D(tex, coords); 
} 

私が使用SFMLので、私は、舞台裏のものにはほとんど触れませんが、使用しているテクスチャはtex変数に渡され、tex_offsetは、経過時間の合計にスクロール速度を制御するための合計経過秒数を掛けて生成されます。

これは想定されているとおりです。一方向にシームレスに繰り返すテクスチャを無期限にスクロールします。それは私のラップトップで動作し、両方のnVidiaカードを持っている私の家のコンピュータで動作します。しかし、ATIカードを搭載したグループメンバーのコンピュータで実行しようとしたとき、何もしなかっただけです。私はいくつかのグーグル・グーグルで、nVidiaカードは互換性に関する問題を説明するかもしれない「非標準」GLSLコードも受け入れているようです。私はGLSLに関する良いチュートリアル/説明を見つけるのが難しいと思います。私が掘り起こすものはバージョン1.2-1.4からであり、バージョン3(gl_FragColor、gl_TexCoord)では廃止された構文を使用しています。しかし、#versionを120または140などに設定しようとしたとき、シェーダもnVidiaコンピュータでの動作を停止しました。

これを質問形式にフレーズしようとすると、このシェーダコードについて何が間違っていますか?構文をデバッグする方法はありますか?これが可能な場合、nVidiaカードの「標準」モードを有効にする方法はありますか?

+0

おそらくバージョン140はサポートされていません – SAKrisT

+0

@SAKrisTとは思わない - バージョン110,120,130,140,​​150,330,400,410,420と体系的に試しました。実際は、 '#version'タグを完全に省略すると動作します。 –

+2

あなた自身が正しい解決策を見つけ出し、既存の答えがすでに与えられていない場合は、自分の質問に対する回答を投稿(および受け入れ)することは完全に有効です。元の質問を編集するよりもはるかに優れています。 –

答えて

1

frac(tex_offset)からfract(tex_offset)に変更され、#バージョンが指定されている場合、ATIカードおよびnVidiaカードで正常に動作します。

関連する問題