QOpenGLShaderProgram 绘制YUV和空心矩形,给出代码例子
时间: 2023-05-21 16:02:39 浏览: 56
以下是一个使用 QOpenGLShaderProgram 绘制 YUV 和空心矩形的代码示例:
```
// 初始化 OpenGL 着色器程序
QOpenGLShaderProgram program;
program.addShaderFromSourceCode(QOpenGLShader::Vertex, "attribute vec4 vertexIn; \
attribute vec2 textureIn; \
varying vec2 textureOut; \
void main(void) { \
gl_Position = vertexIn; \
textureOut = textureIn; \
}");
program.addShaderFromSourceCode(QOpenGLShader::Fragment, "uniform sampler2D tex_y; \
uniform sampler2D tex_u; \
uniform sampler2D tex_v; \
varying vec2 textureOut; \
void main(void) { \
vec3 yuv; \
vec3 rgb; \
yuv.x = texture2D(tex_y, textureOut).r; \
yuv.y = texture2D(tex_u, textureOut).r - 0.5; \
yuv.z = texture2D(tex_v, textureOut).r - 0.5; \
rgb = mat3(1, 1, 1, \
0, -0.39465, 2.03211, \
1.13983, -0.58060, 0) * yuv; \
gl_FragColor = vec4(rgb, 1); \
}");
program.link();
// 绘制 YUV
program.bind();
program.setUniformValue("tex_y", 0);
program.setUniformValue("tex_u", 1);
program.setUniformValue("tex_v", 2);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, y_texture);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, u_texture);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, v_texture);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
// 绘制空心矩形
glLineWidth(2.0f);
glBegin(GL_LINE_LOOP);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.5f, -0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();
```