11

数日前に Gwen を見つけ、私のプロジェクトに最適な GUI ツールキットのように思えました。しかし、レンダラーの OpenGL 2 コードをすべて見てください。そこで、OpenGL 3 レンダラーを作成して実際に使用できるようにしようと考えましたが、GLSL よりも CG に精通しているため、サンプルの作成に行き詰まってしまいました。これらの均一な変数を設定できれば、基本的には完了すべきだと思います。

シェーダーは問題なくコンパイルおよびリンクされます。正射行列とテクスチャ サンプラーに対して -1 を返す glGetUniformLocation に絞り込みましたが、正確にそれを行っている理由がわかりません。典型的な問題は、実際にそれらを使用していない場合、それらが最適化されてしまうことのようですが、私は両方を使用しました。

誰かがアイデアを持っているなら、私はすべて耳を傾けます。適切に機能したら、完全なものを投稿/リンクしていただければ幸いです。これは GLSL での最初の試みなので、ばかげたことを簡単に行うことができます。別のプロジェクトの CG のセットアップを終えたばかりなので、完全に無知というわけではありません。

OpenGL コンテキストの設定後に呼び出される Shader Init コード:

void InitializeShaders(void)
{
    g_ShaderProgram = glCreateProgram();
    g_VertexShader = glCreateShader(GL_VERTEX_SHADER);
    g_FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(g_VertexShader, 1, (const GLchar **)&VertexShaderData, 0);
    glShaderSource(g_FragmentShader, 1, (const GLchar **)&FragmentShaderData, 0);

    glCompileShader(g_VertexShader);
    CheckShaderCompile(g_VertexShader);

    glCompileShader(g_FragmentShader);
    CheckShaderCompile(g_FragmentShader);

    glAttachShader(g_ShaderProgram, g_VertexShader);
    glAttachShader(g_ShaderProgram, g_FragmentShader);

    glBindAttribLocation(g_ShaderProgram, 0, "position");
    glBindAttribLocation(g_ShaderProgram, 1, "color");
    glBindAttribLocation(g_ShaderProgram, 2, "texCoord");

    glBindFragDataLocation(g_ShaderProgram, 0, "color");

    glLinkProgram(g_ShaderProgram);
    CheckShaderLink();

    g_OrthoTransformLocation = glGetUniformLocation(g_ShaderProgram, "orthoTransform");
    g_TextureLocation = glGetUniformLocation(g_ShaderProgram, "textureSampler");
}

シェーダーはヘッダー ファイルに文字列として保存されますが、改行とバックスラッシュをすべて取り除いて、見やすくしています。

頂点シェーダー:

#version 330

in vec4 position;
out vec4 outPosition;
uniform mat4x4 orthoTransform;
void main(void)
{
    outPosition = position * orthoTransform;
}

フラグメント シェーダー:

#version 330

in vec2 texCoord;
in vec4 color;
out vec4 outColor;
uniform sampler2D textureSampler;
void main(void)
{
    //outColor = texture(textureSampler, texCoord) * color;
    outColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
4

2 に答える 2

29

問題は非常に単純です。頂点シェーダーが何もしないため、OpenGL が最適化しています。

三角形をレンダリングするために、OpenGL は三角形の頂点ごとにクリップ スペースの位置を必要とします。これを提供するのは、頂点シェーダーの仕事です。OpenGL では、クリップ スペースの位置にする予定の頂点シェーダー出力を判断できないため、OpenGL ではgl_Position、出力として書き込む必要があります。これを回避することは合法です。これが、シェーダーがコンパイルおよびリンクされる理由です。しかし、ご覧のとおり、レンダリングは失敗します。

于 2011-09-07T21:23:22.900 に答える
3

まず第一に、この場合ではなくglBindFragDatalocationバインドする必要があります。次に、シェーダー プログラムに与えるのは頂点属性であり、フラグメント属性ではありません。頂点シェーダーのは、フラグメント シェーダーの と一致する必要があります。outColorcoloroutin

の場所textureSamplerが -1 である理由は、コードをコメントアウトしたためです。の場所orthoTransformが -1 である理由は、実際には使用されず、最適化されていないためです。out outPositionは、フラグメント シェーダーによって使用されることはありません。これにより、ユニフォームorthoTransformが最適化されます。

あなたが探しているのは だと思いますgl_Position

于 2011-09-07T21:26:16.987 に答える