2013-03-23 49 views
0

这里输出纹理YUV422是截图屏幕与ipad的 http://joxi.ru/7J9NUdg5CbCJWOM8-i0http://joxi.ru/SspPUdg5CbBrLdFutis误差在IOS

错误:

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); 
} 

质地激活Google

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]; 
+1

如果你描述你正在尝试做什么以及你已经尝试了什么,这可能会有帮助。你的代码正在做各种各样的怪事。我会先简单地渲染纹理而不进行变换,然后您可以前进并添加y/u/v位。 – mobob 2013-03-23 17:25:25

+0

我画出来自流的纹理。来到yuv,当我使用swscale转换为rgb时,一切正常。 我想优化,在着色器中进行转换 – user1881371 2013-03-24 07:38:34

+0

看起来问题在于如何上传纹理,而不是颜色转换。它看起来像你的数据宽度不对。 – user1118321 2013-03-24 16:15:18

回答

0

2)尺寸,不能完全SCRE en

CGRect screenRect = [[UIScreen mainScreen] bounds]; 
CAEAGLLayer eaglLayer = (CAEAGLLayer) self.layer; 
[eaglLayer setBounds:screenRect];