2017-05-23 26 views
0

私はlearnopengl.comの本を読んでいて、テクスチャユニットの動作に問題がありました。最初に私は彼が本のようにメインループでglGetUniform1iを呼び出していましたが、メインループの前にテクスチャ処理を制限するように(#プログラミングプログラミングIRC経由で)アドバイスされました。本のコードでは、テクスチャがフラグメントシェーダで定義されているように正しくミックスされず、GL_TEXTURE_2Dにバインドされた2番目のテクスチャ(この場合は "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) 
) 

私にエラーがFRAGに均一変数の位置に関連しているようですシェーダが、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

ああ。それはその問題を解決します。しかし、依然として2番目のテクスチャのみがレンダリングされているという問題に遭遇する。 – OneCleverGorilla

関連する問題