You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL纹理渲染异常:全黑问题排查求助

OpenGL纹理渲染全黑问题排查与修复

核心问题分析与修复步骤

1. 纹理数据类型与尺寸不匹配

glTexImage2D调用存在两处关键错误:

  • 数据类型不匹配:PIL转换后的RGB图片numpy数组默认是uint8类型,但代码中使用GL_UNSIGNED_INT作为数据类型参数,导致OpenGL解析数据错误,应改为GL_UNSIGNED_BYTE。
  • 硬写纹理尺寸:直接指定1920x1080会导致图片尺寸不匹配时数据填充错位,需使用图片实际宽高。

修复后的纹理创建代码:

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)

image = Image.open("./madeline.jpg").convert('RGB')
img_width, img_height = image.size
data = np.array(image).flatten()

gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, img_width, img_height, 0, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, data)
gl.glBindTexture(gl.GL_TEXTURE_2D, 0)  # 可选:解绑避免后续误操作

2. 采样器Uniform未关联纹理单元

片段着色器中的ourTex采样器需要明确绑定到激活的纹理单元(你用了GL_TEXTURE0),否则无法正确采样纹理。需在着色器程序链接后添加:

# 假设program是你的着色器程序ID
tex_uniform_loc = gl.glGetUniformLocation(program, "ourTex")
gl.glUniform1i(tex_uniform_loc, 0)  # 将采样器绑定到纹理单元0

3. 额外验证点

  • 确认图片路径正确:确保madeline.jpg在程序运行的工作目录下,避免因文件缺失导致数据为空。
  • 检查floatSize值:顶点缓冲区设置中floatSize应等于4(float32类型占4字节),保证步长和偏移计算准确。
  • 绘制时VAO绑定:主循环绘制前确认当前绑定的是正确的VAO,避免其他VAO操作覆盖设置。

内容的提问来源于stack exchange,提问作者RandomPigYT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:17:50