頂点シェーダ: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呼び出しに変換するのはとても簡単です。
フラグメントシェーダでTexcoord
は常にvec2(0, 0)
であるかのように振る舞うています。フラグメントシェーダでそのラインを変更してTexcoord
の代わりにvec2(1, 1)
を使用すると、正方形が適切に色を変更します。問題は、imgQuadData
がSとTの値を0以外の値として取得するために頂点シェーダに対して正しく解析されていないことが原因で、その理由を理解できないようです。
私の位置属性は正しく読み取れますが、texcoord属性は常に0になりますか?