編集:スタックオーバーフローで申し訳ありませんが、遅れています。frac(tex_offset)
->fract(tex_offset)
であり、現在指定されている場合は、ATI カードと nVidia カードでも正常に動作し#version
ます。これが、私が知っているほとんどのプログラマーに髪の毛があまり残っていない理由に違いありません。
-
私は学校のプロジェクトのゲームに取り組んでいます。これは垂直スクロールなので、必要な機能の 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 コードも受け入れるようで、互換性の問題を説明している可能性があります。私が掘り起こしたもののほとんどはバージョン 1.2-1.4 のものであり、明らかにバージョン 3 (gl_FragColor、gl_TexCoord) で廃止された構文を使用しているため、GLSL に関する適切なチュートリアル/説明を見つけるのは難しいと思います。しかし、#version
120 や 140 などに設定しようとすると、nVidia コンピューターでシェーダーが動作しなくなりました。
では、これを質問形式で言い表すと、このシェーダー コードのどこが間違っているのでしょうか? 構文をデバッグする方法はありますか? また、可能であれば nVidia カードの「標準」モードを有効にするにはどうすればよいですか?