You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用单纹理着色器程序实现YUV转RGB时图像显示损坏

排查YUV转RGB图像显示损坏的问题

我之前做单纹理+着色器实现YUV转RGB的时候也踩过不少类似的坑,结合你贴的代码,大概率是这几个地方出了问题:

1. 顶点着色器的拼写错误

你贴的顶点着色器最后一行是 v_texCoord = a_texCoor...,这里明显少了最后一个字母d,正确的应该是a_texCoord。这个拼写错误会导致纹理坐标属性无法正确传递到片元着色器,直接造成纹理映射混乱,图像必然损坏。

修正后的顶点着色器应该是这样:

attribute vec4 a_position; 
attribute vec2 a_texCoord; 
varying vec2 v_texCoord; 
void main() 
{ 
    gl_Position = a_position; 
    v_texCoord = a_texCoord; 
}

2. 绘制索引的顺序问题

你当前用的索引数组是:

GLushort indices[] = { 0, 3, 2, 0, 2, 1};

注释掉的是{ 0, 1, 2, 0, 3, 2 }。这两个索引顺序对应的三角形绘制方式不同,可能会导致纹理翻转或者三角形 winding order 错误(如果开启了背面剔除的话)。你可以切换回注释掉的索引试试,或者检查纹理坐标的映射是否和顶点位置匹配。

3. 缺失的片元着色器逻辑

你只贴了顶点着色器的部分代码,但YUV转RGB的核心逻辑是在片元着色器里的。如果片元着色器有问题,比如:

  • YUV采样通道错误(比如把U/V通道当成了Y)
  • 转换公式错误(比如用错了BT.601/BT.709的转换矩阵)
  • 没有正确处理YUV的采样格式(比如YUV420需要对U/V纹理进行采样缩放)
    这些都会直接导致图像颜色失真或者损坏。

4. 纹理参数设置问题

还要检查纹理创建时的参数是否正确:

  • 对于Y分量纹理,格式应该设为GL_LUMINANCE(或者GL_RED在现代GL里)
  • U/V分量同理,确保纹理的内部格式和数据格式匹配
  • 要设置GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_TGL_CLAMP_TO_EDGE,避免边缘采样错误
  • 过滤方式如果是放大/缩小,用GL_LINEAR或者GL_NEAREST,根据需求选择,避免模糊或者锯齿问题

你可以先把顶点着色器的拼写错误修正,然后检查索引顺序,再补全片元着色器的逻辑,应该就能解决大部分问题了。

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

火山引擎 最新活动