qtopengl描画球



Qt Opengl Draw Sphere



一般的なopenglプログラムと同じように、コードはあまり言われていません。

qtでは、qopenglwidgetを使用してopenglプログラムを操作します。ステートメントは次のとおりです。



#ifndef WIDGET_H #define WIDGET_H #include #include 'ballshader.h' class Widget : public QOpenGLWidget { Q_OBJECT public: Widget(QWidget *parent = 0) ~Widget() protected: void initializeGL() override void paintGL() override void resizeGL(int w, int h) override void wheelEvent(QWheelEvent *event) override private: BallShader m_shader //Ball renderer QMatrix4x4 m_pMatrix, m_modelMatrix //Projection matrix, basic transformation matrix QVector3D m_eye,m_target //Viewpoint, and the center of the viewpoint } #endif // WIDGET_H

実装ファイルは次のとおりです

#include 'widget.h' #include Widget::Widget(QWidget *parent) : QOpenGLWidget(parent), m_eye(0,0,1), //initial viewpoint position m_target(0,0,-1) //Initial observation target position { } Widget::~Widget() { } void Widget::initializeGL() { m_shader.initialize(0.8) //Initialize sphere data with radius 0.8 } void Widget::paintGL() { m_modelMatrix.rotate(30,0,1,0) //rotate 30 degrees around the y-axis every refresh QMatrix4x4 camera camera.lookAt(m_eye,m_target,QVector3D{0,1,0}) //Generate camera matrix m_shader.render(QOpenGLContext::currentContext()->extraFunctions(),m_pMatrix,camera,m_modelMatrix) //render } void Widget::resizeGL(int w, int h) { m_pMatrix.setToIdentity() //Reset to identity matrix m_pMatrix.perspective(60.0f,GLfloat(w)/h,0.01f,100.0f) //Set the projection } void Widget::wheelEvent(QWheelEvent *event) { if (! event->pixelDelta().isNull()) { m_eye.setZ(m_eye.z() + event->pixelDelta().y()) //Reset the viewpoint z value } else if (!event->angleDelta().isNull()) { m_eye.setZ(m_eye.z() + (event->angleDelta() / 120).y()) //Reset view point z value } event->accept() update() }

レンダラー部分は次のとおりです

#ifndef BALLSHADER_H #define BALLSHADER_H #include #include #include #define PI 3.14159265f class BallShader { public: BallShader() = default void initialize(float r) void render(QOpenGLExtraFunctions *f,QMatrix4x4 &projM,QMatrix4x4 & camera,QMatrix4x4 &model) private: QOpenGLShaderProgram m_program QOpenGLBuffer m_vbo QVector m_points float m_r } #endif // BALLSHADER_H #include 'ballshader.h' void BallShader::initialize(float r) { m_program.addCacheableShaderFromSourceFile(QOpenGLShader::Vertex,'vsrc.vsh') m_program.addCacheableShaderFromSourceFile(QOpenGLShader::Fragment,'fsrc.fsh') m_program.link() m_r = r int angleSpan = 10 //radian = angle * PI / 180 for(int vAngle = -90 vAngle <90 vAngle = vAngle + angleSpan){ //Generate spherical vertices for(int hAngle = 0 hAngle <= 360 hAngle = hAngle + angleSpan) GL_DEPTH_BUFFER_BIT) f->glEnable(GL_DEPTH_TEST) f->glEnable(GL_CULL_FACE) m_program.bind() m_vbo.bind() m_program.setUniformValue('uPMatrix',projM) m_program.setUniformValue('camMatrix',camera) m_program.setUniformValue('uMMatrix',model) m_program.setUniformValue('uR',m_r) m_program.enableAttributeArray(0) m_program.setAttributeBuffer(0,GL_FLOAT,0,3,0) f->glDrawArrays(GL_TRIANGLES,0,m_points.count() / 3) m_program.disableAttributeArray(0) m_vbo.release() m_program.release() f->glDisable(GL_DEPTH_TEST) f->glDisable(GL_CULL_FACE)

シェーダーは次のとおりです

#version 330 uniform mat4 uPMatrix,camMatrix,uMMatrix layout (location = 0) in vec3 aPosition smooth out vec3 vPosition //Pass vertex coordinates to the fragment shader void main(void) { gl_Position = uPMatrix * camMatrix *uMMatrix * vec4(aPosition,1) vPosition = aPosition } #version 330 uniform float uR //Ball radius in vec3 vPosition out vec4 fragColor void main(void) { vec3 color float n = 8.0 //Number of blocks in x, y, z axis float span = 2.0 * uR / n //length of each block int i = int((vPosition.x + uR) / span) the number of layers on the x axis int j = int((vPosition.y + uR) / span) the number of layers on the y axis int k = int((vPosition.z + uR) / span) the number of layers on the z axis int whichColor = int(mod(float(i+j+k),2.0)) //According to the number of rows and columns, decide the color if(whichColor == 1){ color = vec3(0.678,0.231,0.129) }else{ color = vec3(1.0,1.0,1.0) } fragColor = vec4(color,0) }

Gitlabアドレス: https://gitlab.com/gitHubwhl562916378/ball