【发布时间】:2013-03-23 12:33:48
【问题描述】:
这是 ipad 的屏幕截图 http://joxi.ru/7J9NUdg5CbCJWOM8-i0 存在http://joxi.ru/SspPUdg5CbBrLdFutis
错误:
1)图片(http://joxi.ru/CYRRUdg5CbDiKIByZLo)
2) 大小,不是全屏
我的着色器:
NSString *const yuvFragmentShaderString = SHADER_STRING
(
varying highp vec2 texCoordVarying;
uniform sampler2D s_texture_y;
uniform sampler2D s_texture_u;
uniform sampler2D s_texture_v;
void main()
{
highp float y = texture2D(s_texture_y, texCoordVarying).r;
highp float u = texture2D(s_texture_u, texCoordVarying).r - 0.5;
highp float v = texture2D(s_texture_v, texCoordVarying).r - 0.5;
highp float r = y + 1.402 * v;
highp float g = y - 0.344 * u - 0.714 * v;
highp float b = y + 1.772 * u;
gl_FragColor = vec4(r,g,b,1.0);
}
);
我无法理解着色器或其他地方的问题是什么? 我可以添加代码
更新
创建纹理
const NSUInteger widths[3] = { width, width / 2, width / 2 };
const NSUInteger heights[3] = { height, height, height};
for (int i = 0; i < 3; ++i) {
glBindTexture(GL_TEXTURE_2D, texture[i]);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_LUMINANCE,
widths[i],
heights[i],
0,
GL_LUMINANCE,
GL_UNSIGNED_BYTE,
//pixels[i]);
bytes->data[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
活性纹理
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glUniform1i(uniforms[UNIFORM_TEXTURE], 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glUniform1i(uniforms[UNIFORM_TEXTURE1], 1);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, texture[2]);
glUniform1i(uniforms[UNIFORM_TEXTURE2], 2);
绘制纹理
GLfloat mvpMatrix[16];
[self prepareRender];
[EDMatrixTools applyIdentity:mvpMatrix];
glUniformMatrix4fv(uniforms[UNIFORM_MVP_MATRIX], 1, GL_FALSE, mvpMatrix);
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTURE_COORD, 2, GL_FLOAT, 0, 0, squareTexCoords);
glEnableVertexAttribArray(ATTRIB_TEXTURE_COORD);
[self drawArraysFirst:0 Count:4];
[self presentFramebuffer];
【问题讨论】:
-
如果您描述您正在尝试做什么以及您已经尝试过什么,这可能会有所帮助。您的代码正在做各种古怪的事情。我会先简单地完全按原样渲染纹理而不进行转换,然后您可以向前一步添加 y/u/v 位。
-
我绘制了来自流的纹理。来到 yuv,当我使用 swscale 转换为 rgb 时,一切正常。我要优化,在shader中做转换
-
看起来问题在于您如何上传纹理,而不是颜色转换。看起来您的数据宽度有误。
-
在这种情况下,尝试发出 r/g/b 作为“y”变量来验证纹理。这样你就可以看到图像是否正确通过,通常是纹理没有正确通过。
-
例如github.com/kolyvan/kxmovie。尺寸:const NSUInteger 宽度 [3] = {宽度,宽度/2,宽度/2}; const NSUInteger heights [3] = {height, height / 2, height / 2};
标签: ios opengl-es-2.0 yuv