0

私は OpenGL を初めて使用し、OpenGL 関数への単純な C# バインディングである SharpGL を使用して学習しています。最も単純な頂点シェーダーとフラグメント シェーダーを使用しようとしています。フラグメント シェーダーがそれ自体で出力を生成する場合は問題ありませんが、頂点シェーダーから取得したデータを使用しようとすると、黒い画面しか表示されません。シェーダーは正常にコンパイルされ、プログラムにリンクされています。OpenGL からエラーは返されませんでした。大量の記事、例、チュートリアルの後、なぜそれが起こるのかまだわかりません. これが頂点シェーダーです。

#version 330

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;

out vec3 rgb;

void main()
{
    rgb = vec3(1.0, 0.5, 0.5);
    gl_Position = vec4(position,  1.0);
}

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

#version 330

in vec3 rgb;

out vec3 outColor;

void main()
{
    //outColor = rgb; // black display
    outColor = vec3(1.0, 0.0, 0.4); // works fine
}

初期化コードは次のとおりです。

gl.GenVertexArrays(1, arrayBuffer);
gl.BindVertexArray(arrayBuffer[0]);

gl.GenBuffers(1, pointsBuffer);
gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, pointsBuffer[0]);
gl.BufferData(OpenGL.GL_ARRAY_BUFFER, triangle, OpenGL.GL_STATIC_DRAW);

gl.GenBuffers(1, colorsBuffer);
gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, colorsBuffer[0]);
gl.BufferData(OpenGL.GL_ARRAY_BUFFER, colors, OpenGL.GL_STATIC_DRAW);

最後に、すべての反復で何が起こったかを次に示します。

gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

gl.UseProgram(program.Id);

gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, pointsBuffer[0]);
gl.EnableVertexAttribArray(0);
gl.VertexAttribPointer(0, 3, OpenGL.GL_FLOAT, false, 0, IntPtr.Zero);

gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, colorsBuffer[0]);
gl.EnableVertexAttribArray(1);
gl.VertexAttribPointer(1, 3, OpenGL.GL_FLOAT, false, 0, IntPtr.Zero);

gl.DrawArrays(OpenGL.GL_TRIANGLES, 0, 12);

gl.DisableVertexAttribArray(0);
gl.DisableVertexAttribArray(1);

更新 1 . バッファに渡されるデータは次のとおりです。

private float[] triangle = {
    -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
    0.0f, 0.5f, 0.0f, 
};

private float[] colors = {
    1.0f, 0.0f, 0.0f,
    0.5f, 1.0f, 0.0f,
    0.0f, 0.5f, 0.0f
};
private uint[] arrayBuffer = new uint[1];
private uint[] pointsBuffer = new uint[1];
private uint[] colorsBuffer = new uint[1];

UPD 2 これがシェーダーのコンパイルコードです

private uint CompileProgram(OpenGL gl, List<ShaderMetadata> shaders)
{
    var program = gl.CreateProgram();

    shaders.ForEach(shader => gl.AttachShader(program, CompileShader(gl, shader.Path, shader.Mode)));

    gl.LinkProgram(program);

    var status = ProgramErrorInfo(gl, program);
    if (!String.IsNullOrEmpty(status))
    {
        throw new ArgumentException(status);
    }

    return program;
}

private uint CompileShader(OpenGL gl, string path, uint kind)
{
    using (var fs = new FileStream(path, FileMode.Open))
    {
        using (var reader = new StreamReader(fs))
        {
            var program = reader.ReadToEnd();
            var id = gl.CreateShader(kind);
            gl.ShaderSource(id, program);
            gl.CompileShader(id);

            var status = ShaderErrorInfo(gl, id);
            if (!String.IsNullOrEmpty(status))
            {
                throw new ArgumentException(status);
            }

            return id;
        }
    }
}

private string ShaderErrorInfo(OpenGL gl, uint shaderId)
{
    StringBuilder builder = new StringBuilder(2048);
    gl.GetShaderInfoLog(shaderId, 2048, IntPtr.Zero, builder);
    return builder.ToString();
}

private string ProgramErrorInfo(OpenGL gl, uint programId)
{
    StringBuilder builder = new StringBuilder(2048);
    gl.GetProgramInfoLog(programId, 2048, IntPtr.Zero, builder);
    return builder.ToString();
}

UPD 3そして、コンパイラが呼び出される方法は次のとおりです

var programId = CompileProgram(gl, new List<ShaderMetadata>
            {
                new ShaderMetadata(
                    @"vertex.shader",
                    OpenGL.GL_VERTEX_SHADER),
                new ShaderMetadata(
                    @"fragment.shader",
                    OpenGL.GL_FRAGMENT_SHADER)
            });
4

2 に答える 2

0

まあ、描画後にシェーダープログラムをアンマウントすることで解決しました:

gl.DrawArrays(OpenGL.GL_TRIANGLES, 0, 12);
gl.UseProgram(0);

とにかく、誰かがドキュメントまたは何かへの説明または参照を持っているなら、あなたは大歓迎です。

于 2016-11-14T21:39:14.587 に答える
-1

flatの out と in の両方に追加してみてくださいrgb。これにより、補間ステップが回避され、頂点出力がフラグメント入力に直接マップされます。三角形の色付けで希望する結果が得られない場合がありますが、問題を特定するのに役立ちます.

于 2016-11-14T03:32:05.173 に答える