2017-09-25 11 views
0

버텍스 쉐이더 :OpenGL Vertex Attributes, 위치는 작동하지만 텍스코 코드는 작동하지 않습니까?

#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 호출로 변환하는 것을 아주 사소한 것으로 만듭니다. 항상 vec2(0, 0) 인 프레 그먼트 쉐이더에서 Texcoord 것처럼

red square on yellow background

그것은 행동입니다. 프래그먼트 셰이더에서 해당 라인을 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