2017-05-23 3 views
0

나는 learnopengl.com과 함께 혼자 따라 왔으며 텍스처 유닛이 작동하는 데 문제가있었습니다. 처음에는 메인 루프에서 glGetUniform1i를 호출했지만, 메인 루프 전에 텍스처 조작을 제한하도록 (# 프로그램 프로그래밍 IRC를 통해) 조언을 받았다. 책의 코드에서 문제는 텍스처가 프래그먼트 쉐이더에 정의 된대로 제대로 섞이지 않으며 GL_TEXTURE_2D에 바인딩 된 두 번째 텍스처 (이 경우 "faceTexture") 만 렌더링된다는 것입니다. 렌더링 순서를 뒤집는 것은 먼저 사용 된 텍스처를 렌더링합니다.OpenGL glUniform1i 올바르지 않은 작업

그러나, glUniform1i 호출에 잘못된 동작의 주요 루프가 발생하기 전에 텍스처 유닛 코드를 삽입하는 것은 :

File "C:/Users/1117254/Documents/Python Experiments/OpenGL/OpenGL Testing/main.py", line 171, in main 
    glUniform1i(wood_texture_loc, 0) 
File "C:\Users\1117254\AppData\Local\Programs\Python\Python36\lib\site-packages\OpenGL\platform\baseplatform.py", line 402, in __call__ 
    return self(*args, **named) 
File "errorchecker.pyx", line 53, in 
    OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src\errorchecker.c:1218) 
    OpenGL.error.GLError: GLError(
err = 1282, 
description = b'invalid operation', 
baseOperation = glUniform1i, 
cArguments = (23724032, 0) 
) 

나에 오류가 파편에 균일 한 변수의 위치와 관련된 것으로 보인다 shader,하지만 glGetUniformLocation 위치가 (23724032 인 것처럼 보입니다) 유효한지 확실하지 않습니다. 버텍스 쉐이더 및 프래그먼트와 함께 아래

관련 자료 :

# Shader 
shader = shader_loader.Shader("vertex.vs", "fragment.fs") 

# Vertex Buffering 
vao = GLuint(0) 
vbo = GLuint(0) 
ebo = GLuint(0) 

glGenVertexArrays(1, vao) 
glGenBuffers(1, vbo) 
glGenBuffers(1, ebo) 

glBindVertexArray(vao) 
glBindBuffer(GL_ARRAY_BUFFER, vbo) 
glBufferData(GL_ARRAY_BUFFER, 4 * len(vertices), vertices, GL_STATIC_DRAW) 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo) 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * len(indices), indices, GL_STATIC_DRAW) 

# Position attribute 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * 4, ctypes.c_void_p(0)) 
glEnableVertexAttribArray(0) 

# Color attribute 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * 4, ctypes.c_void_p(3 * 4)) 
glEnableVertexAttribArray(1) 

# Texture attribute 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * 4, ctypes.c_void_p(6 * 4)) 
glEnableVertexAttribArray(2) 

# Unbinding buffers 
glBindVertexArray(0) 

# Texturing 
wood = Image.open("resources/wood.jpg") 
wood.load() 
face = Image.open("resources/awesomeface.jpg") 
face.load() 
# face.transpose(Image.FLIP_LEFT_RIGHT) 

wood_texture_loc = glGetUniformLocation(shader.shader_program, "woodTexture") 
face_texture_loc = glGetUniformLocation(shader.shader_program, "faceTexture") 

wood_data = list(wood.getdata()) 
wood_data = numpy.array(wood_data, dtype=numpy.uint8) 
face_data = list(face.getdata()) 
face_data = numpy.array(face_data, dtype=numpy.uint8) 

# Wood texture 
texture1 = GLuint(0) 
glGenTextures(1, texture1) 
glBindTexture(GL_TEXTURE_2D, texture1) 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) 

glTexImage2D(GL_TEXTURE_2D, 
      0, 
      GL_RGB, 
      wood.size[0], wood.size[1], 
      0, 
      GL_RGB, 
      GL_UNSIGNED_BYTE, 
      wood_data) 
glGenerateMipmap(GL_TEXTURE_2D) 
glBindTexture(GL_TEXTURE_2D, 0) 

# Face texture 
texture2 = GLuint(0) 
glGenTextures(1, texture2) 
glBindTexture(GL_TEXTURE_2D, texture2) 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) 

glTexImage2D(GL_TEXTURE_2D, 
      0, 
      GL_RGB, 
      face.size[0], face.size[1], 
      0, 
      GL_RGB, 
      GL_UNSIGNED_BYTE, 
      face_data) 
glGenerateMipmap(GL_TEXTURE_2D) 
glBindTexture(GL_TEXTURE_2D, 0) 

glActiveTexture(GL_TEXTURE0) 
glBindTexture(GL_TEXTURE_2D, texture1) 
glUniform1i(wood_texture_loc, 0) 
glActiveTexture(GL_TEXTURE1) 
glBindTexture(GL_TEXTURE_2D, texture2) 
glUniform1i(face_texture_loc, 1) 

while True: 

    for event in pygame.event.get(): 
     if event.type == QUIT: 
      terminate() 
     elif event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       terminate() 

    glClearColor(0.4667, 0.7373, 1., 1.0) 
    glClear(GL_COLOR_BUFFER_BIT) 

    shader.use() 

    glBindVertexArray(vao) 
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, None) 
    glBindVertexArray(0) 

    pygame.display.flip() 
    clock.tick(fps) 

정점 셰이더 :

#version 330 
layout (location = 0) in vec3 position; 
layout (location = 1) in vec3 color; 
layout (location = 2) in vec2 texCoords; 

out vec3 ourColor; 
out vec2 texCoordsOut; 

void main() 
{ 
    gl_Position = vec4(position, 1.0f); 
    ourColor = color; 
    texCoordsOut = vec2(texCoords); 
} 

단편 쉐이더 :

#version 330 
in vec3 ourColor; 
in vec2 texCoordsOut; 

out vec4 color; 

uniform sampler2D woodTexture; 
uniform sampler2D faceTexture; 

void main() 
{ 
    color = mix(texture(woodTexture, texCoordsOut), texture(faceTexture, 
texCoordsOut), 0.2); 
} 

어떤 통찰력을 크게 받고있다.

+0

"* 처음에는 메인 루프에서'glGetUniform1i'를 호출했습니다 *"문제의 튜토리얼은 아닙니다. 그것은'glGetUniformLocation'을 호출하지만 그것은 다른 기능입니다. 당신은 또한'glGetUniform1i'를 호출하지 않습니다; 실제로, 그런 기능은 없습니다 *. 아마도 당신은'glUniform1i'을 의미했을 것입니다. 이것은 다시 다른 기능입니다. –

+0

죄송합니다. 그래, 나는 glUniform1i를 의미했다. – OneCleverGorilla

답변

4

glUniform* 수정 프로그램 개체를 사용하지 않습니다. 따라서 현재 사용중인 프로그램을 수정합니다. 현재 사용중인 프로그램이 없으므로 오류가 발생합니다.

이 함수를 호출하기 전에 프로그램을 사용하십시오.

+0

아 좋아요. 그것은 그 문제를 해결합니다. 그러나 여전히 두 번째 텍스처 만 정의 된 렌더링 문제가 발생합니다. – OneCleverGorilla

관련 문제