#include "testcurb.h"
#include <QPainter>
testCurb::testCurb(QWidget *parent):QOpenGLWidget(parent)
{
}
void testCurb::initializeGL()
{
initializeOpenGLFunctions();
const char *vertexShaderSrc =
// "#version 300 es\n"
"attribute vec4 a_position; \n"
"uniform mat4 u_mvp; \n"
"varying vec4 v_color; \n"
"void main() \n"
"{ \n"
" v_color = a_position*0.7 + 0.5; \n"
" gl_Position = u_mvp * a_position; \n"
"} \n";
const char *fragmentShaderSrc =
// "#version 300 es\n"
"varying vec4 v_color; \n"
"void main() \n"
"{ \n"
" gl_FragColor = v_color; \n"
"} \n";
GLuint vertexShader = LoadShader(GL_VERTEX_SHADER,vertexShaderSrc);
GLuint fragmentShader = LoadShader(GL_FRAGMENT_SHADER,fragmentShaderSrc);
m_program = glCreateProgram();
glAttachShader(m_program, vertexShader);
glAttachShader(m_program, fragmentShader);
glLinkProgram(m_program);
//检查链接状态
GLint linked;
glGetProgramiv(m_program,GL_LINK_STATUS,&linked);
if(!linked)
return ;
// set the background clear color.
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
void testCurb::exposeEvent(QExposeEvent *event)
{
}
GLuint testCurb::LoadShader(GLenum type,const char *shaderSrc)
{
GLuint shader;
GLint compiled;
shader = glCreateShader(type);
if(shader == 0)
return 0;
//加载shader
glShaderSource(shader,1,&shaderSrc,nullptr);
//编译着色器
glCompileShader(shader);
//检查编译状态
glGetShaderiv(shader,GL_COMPILE_STATUS,&compiled);
if(compiled==0)
{
return 0;
}
return shader;
}
void testCurb::resizeGL(int w, int h)
{
// Calculate aspect ratio
qreal aspect = qreal(w) / qreal(h ? h : 1);
// Set near plane to 3.0, far plane to 7.0, field of view 45 degrees
const qreal zNear = 3.0, zFar = 7.0, fov = 45.0;
// Reset projection
projection.setToIdentity();
// Set perspective projection
projection.perspective(fov, aspect, zNear, zFar);
}
void testCurb::paintGL()
{
qDebug() << 1;
static GLfloat vCubeVertices[] = {
-0.5f, 0.5f, 0.5f, // v0
-0.5f, -0.5f, 0.5f, // v1
0.5f, -0.5f, 0.5f, // v2
0.5f, 0.5f, 0.5f, // v3
0.5f, -0.5f, -0.5f, // v4
0.5f, 0.5f, -0.5f, // v5
-0.5f, 0.5f, -0.5f, // v6
-0.5f, -0.5f, -0.5f, // v7
};
static GLushort vCubeIndices[] = {
0, 1, 2, 0, 2, 3, // front face
5, 6, 7, 4, 5, 7, // back face
0, 1, 7, 0, 6, 7, // left face
2, 3, 4, 3, 4, 5, // right face
0, 3, 5, 0, 5, 6, // top face
1, 2, 4, 1, 4, 7 // bottom face
};
glViewport(0, 0, width(), height());
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(m_program);
GLuint vbos[2];
glGenBuffers(2, vbos);
glBindBuffer(GL_ARRAY_BUFFER, vbos[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vCubeVertices), vCubeVertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vCubeIndices), vCubeIndices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vbos[0]);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glBindAttribLocation(m_program, 0, "a_position");
static GLfloat angle = 0.0;
GLint mvpLoc = glGetUniformLocation(m_program, "u_mvp");
QMatrix4x4 model, view, projection, mvp;
model.rotate(angle + 5, QVector3D(1,0,0));
model.rotate(angle - 5, QVector3D(0,1,0));
model.scale(0.5, 0.5, 0.5);
view.translate(0.5, 0.5, 0);
angle += 10;
mvp = projection * view * model;
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, mvp.constData());
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos[1]);
glDrawElements(GL_TRIANGLES, sizeof(vCubeIndices)/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
/* draw another cube in different place with the same shader */
view.translate(-1.0, 0, 0);
mvp = projection * view * model;
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, mvp.constData());
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos[1]);
glDrawElements(GL_TRIANGLES, sizeof(vCubeIndices)/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
view.translate(0.0, -1.0, 0);
mvp = projection * view * model;
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, mvp.constData());
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos[1]);
glDrawElements(GL_TRIANGLES, sizeof(vCubeIndices)/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
view.translate(1.0, 0, 0);
mvp = projection * view * model;
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, mvp.constData());
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos[1]);
glDrawElements(GL_TRIANGLES, sizeof(vCubeIndices)/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
}
QT使用openglES模块做的立方体程序
2星 需积分: 48 49 浏览量
2019-04-09
08:58:00
上传
评论 1
收藏 3KB ZIP 举报
普通网友
- 粉丝: 0
- 资源: 7