2017-09-25 4 views
0

頂点シェーダ:OpenGL Vertex Attributes、位置は動作しますがtexcoordは動作しませんか?

#version 130 

in vec2 position; 
in vec2 texcoord; 

out vec3 Color; 
out vec2 Texcoord; 

void main() { 
    Texcoord = texcoord; 
    gl_Position = vec4(position, 0, 1); 
} 

フラグメントシェーダ:私は私のイメージを初期化

#version 130 

in vec2 Texcoord; 
uniform sampler2D texImage; 

void main() 
{ 
    gl_FragColor = texture2D(texImage, Texcoord); 
} 

:オン

gl.ClearColor(1, 1, 0, 1) 
gl.Clear(gl.COLOR_BUFFER_BIT) 
gl.UseProgram(texProgram) 
gl.BindBuffer(gl.ARRAY_BUFFER, imgQuadBuffer) 
gl.DrawArrays(gl.QUADS, 0, 4) 

:私は画面に描画

func initImage() { 
    gl.UseProgram(texProgram) 
    var vao uint32 
    gl.GenVertexArrays(1, &vao) 
    gl.BindVertexArray(vao) 
    imgQuadData := []float32{ 
     -.5, .5, 0, 0, // Top Left 
     .5, .5, 1, 0, // Top Right 
     .5, -.5, 1, 1, // Bottom Right 
     -.5, -.5, 0, 1, // Bottom Left 
    } 

    gl.GenBuffers(1, &imgQuadBuffer) 
    gl.BindBuffer(gl.ARRAY_BUFFER, imgQuadBuffer) 
    gl.BufferData(gl.ARRAY_BUFFER, len(imgQuadData)*4, gl.Ptr(imgQuadData), gl.STATIC_DRAW) 

    posAttrib = gl.GetAttribLocation(texProgram, gl.Str("position\x00")) 
    gl.EnableVertexAttribArray(uint32(posAttrib)) 
    gl.VertexAttribPointer(uint32(posAttrib), 2, gl.FLOAT, false, 4*4, gl.Ptr(nil)) 

    texAttrib = gl.GetAttribLocation(texProgram, gl.Str("texcoord\x00")) 
    gl.EnableVertexAttribArray(uint32(texAttrib)) 
    ptr := 2 * 4 
    gl.VertexAttribPointer(uint32(texAttrib), 2, gl.FLOAT, false, 4*4, gl.Ptr(&ptr)) 

    pixels := []float32{ 
     1, 0, 0, 0, 1, 0, // Red/Green 
     0, 0, 1, 1, 1, 1, // Blue/White 
    } 
    gl.ActiveTexture(gl.TEXTURE0) 
    gl.GenTextures(1, &bcTexture) 
    gl.BindTexture(gl.TEXTURE_2D, bcTexture) 
    gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGB, 2, 2, 0, gl.RGB, gl.FLOAT, gl.Ptr(&pixels[0])) 
    gl.Uniform1i(gl.GetUniformLocation(texProgram, gl.Str("texImage\x00")), 0) 

    gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) 
    gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) 
    gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) 
    gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) 
} 

ラptop私は1.30で動作しています最新のGLSL言語バージョンがサポートされているので、私は新しいバージョンに移行することはできません。

imgQuadDataには、クワッドのコーナーを描画する場所のX/Y位置と、そのコーナーでのテクスチャ座標のS/T値を設定する必要があります。私はthis tutorialに行って私が持っているものに到達しました。私は外出先で働いていますが、go-glライブラリはC++ GL呼び出しをGL呼び出しに変換するのはとても簡単です。

red square on yellow background

フラグメントシェーダでTexcoordは常にvec2(0, 0)であるかのように振る舞うています。フラグメントシェーダでそのラインを変更してTexcoordの代わりにvec2(1, 1)を使用すると、正方形が適切に色を変更します。問題は、imgQuadDataがSとTの値を0以外の値として取得するために頂点シェーダに対して正しく解析されていないことが原因で、その理由を理解できないようです。

私の位置属性は正しく読み取れますが、texcoord属性は常に0になりますか?

答えて

0

gl.VertexAttribPointerに最後のパラメータを指定するときは、gl.Ptrの代わりにgl.PtrOffsetを使用する必要があります。私はGLが何を見ていたのかは、gl.Ptrは、8でなければならないときには大きなアドレスだったと思います(サイズ4の最初の2つの浮動小数点はスキップします)。

proper color blur

関連する問題