私は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);
}
任意の洞察力が大幅に高く評価されています。
"*私は最初にメインループで' glGetUniform1i'を呼び出していました* "問題のチュートリアルはありません。 'glGetUniformLocation'を呼び出しますが、これは別の関数です。 'glGetUniform1i'も呼び出さないでください。確かに、このような機能はありません。おそらくあなたは 'glUniform1i'を意味していました。これはやはり別の機能です。 –
おっとはい、私はglUniform1iを意味しました。 – OneCleverGorilla