Qt opengl画多个渐变三角形,不要用着色器
时间: 2024-03-05 17:51:49 浏览: 102
如果不使用着色器,可以使用OpenGL的固定管线实现渐变三角形的绘制。具体步骤如下:
1. 启用OpenGL的混合功能,使得颜色能够叠加。
```c++
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
```
2. 设置三角形的顶点颜色,通过OpenGL的颜色插值功能实现渐变效果。例如,设置三角形的三个顶点颜色分别为红色、绿色和蓝色,则OpenGL会自动在三角形内部进行颜色插值。
```c++
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.5f, 0.0f);
glEnd();
```
3. 可以使用glShadeModel函数设置OpenGL的着色模式。如果要实现渐变的效果,建议使用GL_SMOOTH模式。
```c++
glShadeModel(GL_SMOOTH);
```
4. 最后,需要确保OpenGL的深度测试功能被禁用,否则可能会出现渲染错误。
```c++
glDisable(GL_DEPTH_TEST);
```
通过上述步骤,可以在不使用着色器的情况下,实现多个渐变三角形的绘制。
相关问题
Qt Opengl画一个渐变三角形,不要使用着色器
要画一个渐变三角形,可以使用纹理和顶点颜色来实现,而无需使用着色器。以下是实现步骤:
1. 创建一个OpenGL窗口和OpenGL上下文。可以使用Qt的QtOpenGL模块来实现。
2. 创建一个三角形的顶点数组和颜色数组。顶点数组包含三个顶点的坐标,颜色数组包含三个顶点的颜色。
3. 创建一个纹理并加载一个渐变颜色图像。可以使用Qt的QImage和QOpenGLTexture类来实现。
4. 绑定纹理并设置纹理过滤器和纹理坐标。可以使用OpenGL的glBindTexture和glTexParameter函数来实现。
5. 启用顶点和颜色数组并设置顶点和颜色数据。可以使用OpenGL的glEnableClientState和glVertexPointer/glColorPointer函数来实现。
6. 绘制三角形并关闭顶点和颜色数组。可以使用OpenGL的glDrawArrays和glDisableClientState函数来实现。
以下是一个简单的Qt Opengl代码示例:
```
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLTexture>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
GLWidget(QWidget *parent = nullptr)
: QOpenGLWidget(parent)
{
}
protected:
void initializeGL() override
{
initializeOpenGLFunctions();
// 创建顶点和颜色数组
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLfloat colors[] = {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
};
// 创建纹理并加载渐变颜色图像
QImage image(256, 1, QImage::Format_RGB888);
for (int i = 0; i < 256; i++) {
image.setPixelColor(i, 0, QColor(i, i, i));
}
m_texture = new QOpenGLTexture(image);
// 绑定纹理并设置过滤器和纹理坐标
m_texture->bind();
m_texture->setMinificationFilter(QOpenGLTexture::Nearest);
m_texture->setMagnificationFilter(QOpenGLTexture::Linear);
m_texture->setWrapMode(QOpenGLTexture::Repeat);
// 启用顶点和颜色数组并设置顶点和颜色数据
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(3, GL_FLOAT, 0, colors);
// 绘制三角形并关闭顶点和颜色数组
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
}
private:
QOpenGLTexture* m_texture;
};
```
Qt opengl画多个渐变三角形,不要用着色器,输出完整代码
以下是一个简单的示例程序,用于在Qt中使用OpenGL绘制多个渐变三角形。该程序使用固定管线实现,不需要使用着色器。
```c++
#include <QtWidgets>
#include <QtOpenGL>
class GLWidget : public QGLWidget
{
public:
GLWidget(QWidget *parent = 0) : QGLWidget(parent) {}
protected:
void initializeGL()
{
// 启用混合功能
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// 设置着色模式为平滑模式
glShadeModel(GL_SMOOTH);
// 禁用深度测试
glDisable(GL_DEPTH_TEST);
}
void paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
// 绘制第一个渐变三角形
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.5f, 0.0f);
glEnd();
// 绘制第二个渐变三角形
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.0f, -0.5f, 0.0f);
glColor3f(0.0f, 1.0f, 1.0f);
glVertex3f(0.5f, 0.5f, 0.0f);
glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glEnd();
// 绘制第三个渐变三角形
glBegin(GL_TRIANGLES);
glColor3f(0.5f, 0.0f, 1.0f);
glVertex3f(-1.0f, -0.5f, 0.0f);
glColor3f(0.0f, 1.0f, 0.5f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glColor3f(1.0f, 0.5f, 0.0f);
glVertex3f(-1.5f, 0.5f, 0.0f);
glEnd();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GLWidget w;
w.resize(640, 480);
w.show();
return a.exec();
}
```
在上述代码中,GLWidget是一个继承自QGLWidget类的自定义OpenGL窗口,其中initializeGL()函数用于初始化OpenGL状态,paintGL()函数用于绘制渐变三角形。在paintGL()函数中,我们通过glBegin和glEnd函数绘制三个渐变三角形,每个三角形的顶点颜色都不同,OpenGL会自动在三角形内部进行颜色插值,从而实现渐变的效果。
阅读全文