我正在try 在OpenGL中渲染纹理.但是,纹理是完全黑色的.
纹理渲染在由2个三角形组成的屏幕大小的四边形上.三角形使用三角形扇形模式进行渲染.
如果有人能指出我代码中的问题,那将是非常有帮助的.
创建纹理:
texture = gl.glGenTextures(1)
gl.glActiveTexture(gl.GL_TEXTURE0)
gl.glBindTexture(gl.GL_TEXTURE_2D, texture)
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST)
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_REPEAT);
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_REPEAT);
viewport = gl.glGetIntegerv(gl.GL_VIEWPORT)
width = viewport[2]
height = viewport[3]
print(width, height)
image = Image.open("./madeline.jpg").convert('RGB')
data = np.array(image).flatten()
#gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, width, height, 0, gl.GL_RGB, gl.GL_FLOAT, None)
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, 1920, 1080, 0, gl.GL_RGB, gl.GL_UNSIGNED_INT, data)
gl.glBindTexture(gl.GL_TEXTURE_2D, texture)
顶点数据:
# vertex -> x, y, z, u, v
vertices = [
-1, 1, 0, 0, 1, # top-left
1, 1, 0, 1, 1, # top-right
1, -1, 0, 1, 0, # bottom-right
-1, -1, 0, 0, 0 # bottom-left
]
设置缓冲区:
# setup buffers
vao = gl.glGenVertexArrays(1)
vbo = gl.glGenBuffers(1)
gl.glBindVertexArray(vao)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vbo)
gl.glBufferData(gl.GL_ARRAY_BUFFER, len(vertices) * floatSize, np.array(vertices, dtype="float32"), gl.GL_STATIC_DRAW)
gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, gl.GL_FALSE, 5 * floatSize, None)
gl.glVertexAttribPointer(1, 2, gl.GL_FLOAT, gl.GL_FALSE, 5 * floatSize, 3 * floatSize)
gl.glEnableVertexAttribArray(0)
gl.glEnableVertexAttribArray(1)
gl.glBindVertexArray(vao)
顶点明暗器:
#version 430 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 texCoord;
out vec2 tex;
void main() {
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
tex = texCoord;
}
片段着色器:
#version 430 core
out vec4 fragColour;
in vec2 tex;
uniform sampler2D ourTex;
void main(){
fragColour = texture(ourTex, tex);
}
主循环:
while not glfwWindowShouldClose(window):
gl.glClearColor(0.2, 0.3, 0.3, 1.0)
gl.glClear(gl.GL_COLOR_BUFFER_BIT)
#gl.glDrawElements(gl.GL_TRIANGLES, 6, gl.GL_UNSIGNED_INT, 0)
gl.glDrawArrays(gl.GL_TRIANGLE_FAN, 0, 4)
glfwSwapBuffers(window)
glfwPollEvents()