GLSL-#330から#130へのシェーダーの書き換え


7

私は最近、ジオメトリシェーダーを使用してポイントをテクスチャ付きの三角形/カリングに変換するゲーム(LD21)を作成しました。#330のサポートが広く普及している印象を受けたので、#330シェーダーのみを作成しましたが、それほど古いハードウェアの多くは#130のみをサポートしているようです(GLViewによると)。

今、私は#330のコア機能に慣れているだけなので、シェーダーを#130に書き換えるのに苦労しています。フラグメントシェーダーを書き換えるのは非常に簡単でしたが、頂点シェーダーとジオメトリシェーダーを#150まで下げることができました。

それで、シェーダーを書き換えることは可能ですか、それとも私のレンダリングエンジンで多くの変更が必要になるでしょうか?

ジオメトリシェーダー

#version 150
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
uniform mat4 oMatrix;
in VertexData
{
    vec4 position;
    vec4 texcoord;
    vec4 size;
} vert;

out vec2 gTexCoord;

void main()
{
    if(vert.position.x>-4f && vert.position.x<4f && vert.position.y>-2f && vert.position.y<2f)
    {
        gTexCoord=vec2(vert.texcoord.z,vert.texcoord.y);
        gl_Position = vert.position + vec4(vert.size.x,vert.size.y,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.x,vert.texcoord.y);
        gl_Position = vert.position + vec4(0.0,vert.size.y,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.z,vert.texcoord.w);
        gl_Position = vert.position + vec4(vert.size.x,0.0,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.x,vert.texcoord.w);
        gl_Position = vert.position;
        EmitVertex();

        EndPrimitive();
    }
}

頂点シェーダー

#version 150
#extension GL_ARB_explicit_attrib_location : enable

layout (location = 0) in vec2 position;
layout (location = 1) in vec4 textureCoord;
layout (location = 2) in vec2 size;
uniform mat4 oMatrix;
uniform vec2 offset;
out VertexData
{
    vec4 position;
    vec4 texcoord;
    vec4 size;
} outData;

void main()
{
    outData.position = oMatrix * vec4(position.x+offset.x,position.y+offset.y,0,1);
    outData.texcoord = textureCoord;
    outData.size = oMatrix * vec4(size.x,size.y,0,0);
}

承認および賛成投票の機能について自分に知らせることを忘れないでください。
Christian Rau、2011

2
「承認および賛成投票の機能について自分に知らせることを忘れないでください。」読む:「私の回答を受け入れる」
ジョナサンコネル2011

1
@ジョナサンはそういう意味ではありませんでした。答えが役に立たなかった場合、受け入れないのは失礼ではありません。実際、OPは私の回答をあまりにも早く受け入れた可能性があります(そのため申し訳ありません)。しかし、私は(まだ短いSOライフであっても)一度だけ訪問者が質問して完全にそれを忘れるのをよく見ます(たぶん彼らは3分後に自分で解決したか、サイトをフォーラムと間違えました)。しかし、評判システムは、このフィードバック指向のQ&Aサイトの原動力です。考えずに私の回答をすぐに受け入れることを意図したものではありませんでしたが、書かれているように、(多くの初心者はそうではないので)受け入れ機能に注意してください。
クリスチャン・ラウ

@ジョナサンそしてちなみに、私はそれらのリマインダーを私が答えていない最初の質問にすでに書いています。しかし、あなたはそれがここで少し自己阻止されているという点で正しいです。
クリスチャン・ラウ2011

1
@Christian Rauこれは確かに時々起こりますが、人々に疑いの利益を与えることがおそらく最善です。コメントを投稿したい場合は、「ようこそ、サイトのルールを読んでください」の方が適切ですIMO :)ああ、あなたの答えに+1);)
Jonathan Connell

回答:


5

まず、structさまざまなデータ(1.50で変更)にを使用することはできませんが、inandのout代わりにattributeandを使用できますvarying。さらにgl_Position、頂点シェーダーの組み込み変数に書き込む必要があります(1.40で変更)。したがって、頂点シェーダーでの宣言outDataを次のようなものに置き換えます

out vec4 texcoord;
out vec4 vSize;       //size already used

gl_Position代わりに使用しますoutData.position

ARB_explicit_attrib_location拡張機能がすでにコアであるかどうかは不明なので、追加する必要があるかもしれません

#extension ARB_explicit_attrib_location : require

この拡張機能がサポートされていない場合は、layout構文を使用するかglBindAttribLocation、シェーダーをリンクする前に呼び出すことで、アプリケーションの属性の場所を設定します。

ジオメトリシェーダーで、vertのdecralationを次のようなものに変更します。

in vec4 texcoord[];      //names have to match vertex shader, of course
in vec4 vSize[];

(ポイントを使用しているので)単一の入力しか取得しませんが、それらは配列である必要があります([0]使用する場合は常にでインデックスを作成しますが)。の使用をvert.positionに変更しますgl_PositionIn[0]

次に、layoutジオメトリシェーダーの構文は1.50で導入されたと思うので、を使用してアプリケーションでジオメトリシェーダーのレイアウトを設定する必要があるかもしれませんglProgramParameteri

まだ2.1ハードウェアを使用しているので、ジオメトリシェーダーや最新の構文に関する実際的な経験はあまりありませんが、これらの変更はそれぞれの仕様を調べることで推測できます。コンパイル(またはリンク)が何が問題であるかについてのヒントを得られない場合は、シェーダー情報ログを確認してください。

行方不明のlayout頂点とジオメトリシェーダの両方の構文は、そう、最後にそれらを試してみてください、あなたのアプリケーションコードにいくつかの小さな追加を必要とするかもしれない唯一のものですが、彼らは本当にunsupprtedある場合、私は完全にはよく分かりません。

また、何かを見落としてもシェーダーが機能しない場合は、質問を更新してください。今回はGLSLコンパイラーからのエラーメッセージが表示される可能性があります。


ありがとう!#140まで下がったが、#130は私の手の届くところにある:)
nilstastic

1
@nilstaticでは、何を変更し、何がまだ機能しないのでしょうか。質問を編集して、新しい1.40シェーダーを含めることができます。すでに1.40を取得している場合は、カスタムのposition変動するto gl_Position`の使用を変更する必要があるだけかもしれません。
クリスチャン・ラウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.