2

編集:スタックオーバーフローで申し訳ありませんが、遅れています。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 に関する適切なチュートリアル/説明を見つけるのは難しいと思います。しかし、#version120 や 140 などに設定しようとすると、nVidia コンピューターでシェーダーが動作しなくなりました。

では、これを質問形式で言い表すと、このシェーダー コードのどこが間違っているのでしょうか? 構文をデバッグする方法はありますか? また、可能であれば nVidia カードの「標準」モードを有効にするにはどうすればよいですか?

4

1 に答える 1

1

に変更frac(tex_offset)されfract(tex_offset)、ATI カードで正常に動作し、#version が指定されている場合は nVidia カードでも動作するようになりました。

于 2012-05-16T18:38:52.453 に答える