我正在尝试熟悉opengl中的着色器.这是我找到的一些示例代码(使用openframeworks).代码只是在两次通过中模糊图像,首先是水平,然后是垂直.这是水平着色器的代码.我唯一的困惑是纹理坐标.他们超过1.
void main( void )
{
vec2 st = gl_TexCoord[0].st;
//horizontal blur
//from http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/
vec4 color;
color += 1.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * -4.0, 0));
color += 2.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * -3.0, 0));
color += 3.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * -2.0, 0));
color += 4.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * -1.0, 0));
color += 5.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt , 0));
color += 4.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * 1.0, …Run Code Online (Sandbox Code Playgroud) 在我的Mac应用程序中,我根据附加相机的YUV 4:2:2数据定义矩形纹理.使用标准顶点和纹理坐标,我可以将它绘制到屏幕上的矩形区域,没有任何问题.
但是,我想使用GLSL片段着色器在GPU上处理这些图像帧,并且无法将矩形视频纹理作为一个统一体传递给片段着色器.当我尝试这样做时,纹理只读为黑色.
着色器程序编译,链接和传递验证.我从着色器程序中收到了制服的正确地址.其他制服(如浮点值)正确传入,片段着色器响应这些值的变化.片段着色器接收正确的纹理坐标.我还使用glGetError()自由地散布了我的代码,并且在任何地方都没有看到任何错误.
顶点着色器如下:
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器如下:
uniform sampler2D videoFrame;
void main()
{
gl_FragColor = texture2D(videoFrame, gl_TexCoord[0].st);
}
Run Code Online (Sandbox Code Playgroud)
这应该只是在我的矩形几何体上显示纹理.
相关的图纸代码如下:
static const GLfloat squareVertices[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f,
};
const GLfloat textureVertices[] = {
0.0, videoImageSize.height,
videoImageSize.width, videoImageSize.height,
0.0, 0.0,
videoImageSize.width, 0.0
};
CGLSetCurrentContext(glContext);
if(!readyToDraw)
{
[self initGL];
readyToDraw = YES;
}
glViewport(0, 0, (GLfloat)self.bounds.size.width, (GLfloat)self.bounds.size.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); …Run Code Online (Sandbox Code Playgroud)