Answer the question
In order to leave comments, you need to log in
Why is the cube not shown on the stage and how to fix it?
The cube is not displayed on the stage. As I understand it, this is due to the matrices "separately designated" because when MVPMatrix was, everything worked. Sorry for a possibly dumb question (I'm a newbie). Please help me fix
My sources:
mainwindow.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QMessageBox>
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent) :
QOpenGLWidget(parent),
m_texture(nullptr),
m_vertexBuffer(QOpenGLBuffer::VertexBuffer),
m_indexBuffer(QOpenGLBuffer::IndexBuffer)
{
}
MainWindow::~MainWindow()
{
}
void MainWindow::initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
initShaders();
initCube(1.0f);
}
void MainWindow::resizeGL(int w, int h)
{
float aspect = w / qreal(h ? h : 1);
m_projectionMatrix.setToIdentity();
m_projectionMatrix.perspective(45, aspect, 0.1f, 10.0f);
}
void MainWindow::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
QMatrix4x4 ViewMatrix;
ViewMatrix.setToIdentity();
QMatrix4x4 modelmatrix;
modelmatrix.setToIdentity();
m_texture->bind(0);
m_shaderProgramm.bind();
m_shaderProgramm.setUniformValue("projectionmatrix", m_projectionMatrix);
m_shaderProgramm.setUniformValue("viewmatrix", ViewMatrix);
m_shaderProgramm.setUniformValue("modelmatrix", modelmatrix);
m_shaderProgramm.setUniformValue("Texture", 0);
// Bind buffers
m_vertexBuffer.bind();
int offset = 0;
int location = m_shaderProgramm.attributeLocation("a_position");
m_shaderProgramm.enableAttributeArray(location);
m_shaderProgramm.setAttributeBuffer(location, GL_FLOAT, offset, 3, sizeof(VertexData));
offset += sizeof(QVector3D);
int texturelocation = m_shaderProgramm.attributeLocation("a_textcoord");
m_shaderProgramm.enableAttributeArray(texturelocation);
m_shaderProgramm.setAttributeBuffer(texturelocation, GL_FLOAT, offset, 2, sizeof(VertexData));
m_indexBuffer.bind();
glDrawElements(GL_TRIANGLES, m_indexBuffer.size(), GL_UNSIGNED_INT, 0);
}
void MainWindow::closeEvent(QCloseEvent *event)
{
qDebug() << "In close event\n";
QMessageBox::StandardButton ret;
ret = QMessageBox::question( this, QApplication::applicationName(), tr(" Do you want to close programm ? "),
QMessageBox::Yes | QMessageBox::No , QMessageBox::No );
if (ret == QMessageBox::No)
event->ignore();
else
close();
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->buttons() == Qt::LeftButton) {
m_mousePosition = QVector2D(event->localPos());
}
event->accept();
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() != Qt::LeftButton) return;
QVector2D diff = QVector2D(event->localPos()) - m_mousePosition;
m_mousePosition = QVector2D(event->localPos());
float angle = diff.length() / 2.0f;
QVector3D axis = QVector3D(diff.y(), diff.x(), 0.0f);
m_rotation = QQuaternion::fromAxisAndAngle(axis, angle) * m_rotation;
update();
}
void MainWindow::initShaders()
{
if (!m_shaderProgramm.addShaderFromSourceFile(QOpenGLShader::Vertex, "://vshader.vsh"))
close();
if (!m_shaderProgramm.addShaderFromSourceFile(QOpenGLShader::Fragment, "://fshader.fsh"))
close();
if (m_shaderProgramm.link())
close();
if (!m_shaderProgramm.bind())
close();
}
void MainWindow::initCube(float width)
{
float width_div_2 = width / 2;
QVector<VertexData> vertexes;
//front, right, top, back, left, down
// Top side
vertexes.append(VertexData(QVector3D(width_div_2, width_div_2, width_div_2), QVector2D(0.0f, 1.0f), QVector3D(0.0f, 1.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, width_div_2, -width_div_2), QVector2D(0.0f, 0.0f), QVector3D(0.0f, 1.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, width_div_2, width_div_2), QVector2D(1.0f, 1.0f), QVector3D(0.0f, 1.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, width_div_2, -width_div_2), QVector2D(1.0f, 0.0f), QVector3D(0.0f, 1.0f, 0.0f)));
// Down side
vertexes.append(VertexData(QVector3D(-width_div_2, -width_div_2, width_div_2), QVector2D(0.0f, 1.0f), QVector3D(0.0f, -1.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, -width_div_2, -width_div_2), QVector2D(0.0f, 0.0f), QVector3D(0.0f, -1.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, -width_div_2, width_div_2), QVector2D(1.0f, 1.0f), QVector3D(0.0f, -1.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, -width_div_2, -width_div_2), QVector2D(1.0f, 0.0f), QVector3D(0.0f, -1.0f, 0.0f)));
// Left side
vertexes.append(VertexData(QVector3D(-width_div_2, width_div_2, width_div_2), QVector2D(0.0f, 1.0f), QVector3D(-1.0f, 0.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, width_div_2, -width_div_2), QVector2D(0.0f, 0.0f), QVector3D(-1.0f, 0.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, -width_div_2, width_div_2), QVector2D(1.0f, 1.0f), QVector3D(-1.0f, 0.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, -width_div_2, -width_div_2), QVector2D(1.0f, 0.0f), QVector3D(-1.0f, 0.0f, 0.0f)));
// Right side
vertexes.append(VertexData(QVector3D(width_div_2, width_div_2, width_div_2), QVector2D(0.0f, 1.0f), QVector3D(1.0f, 0.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, -width_div_2, width_div_2), QVector2D(0.0f, 0.0f), QVector3D(1.0f, 0.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, width_div_2, -width_div_2), QVector2D(1.0f, 1.0f), QVector3D(1.0f, 0.0f, 0.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, -width_div_2, -width_div_2), QVector2D(1.0f, 0.0f), QVector3D(1.0f, 0.0f, 0.0f)));
// Front side
vertexes.append(VertexData(QVector3D(-width_div_2, width_div_2, width_div_2), QVector2D(0.0f, 1.0f), QVector3D(0.0f, 0.0f, 1.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, -width_div_2, width_div_2), QVector2D(0.0f, 0.0f), QVector3D(0.0f, 0.0f, 1.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, width_div_2, width_div_2), QVector2D(1.0f, 1.0f), QVector3D(0.0f, 0.0f, 1.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, -width_div_2, width_div_2), QVector2D(1.0f, 0.0f), QVector3D(0.0f, 0.0f, 1.0f)));
// Back side
vertexes.append(VertexData(QVector3D(width_div_2, width_div_2, -width_div_2), QVector2D(0.0f, 1.0f), QVector3D(0.0f, 0.0f, -1.0f)));
vertexes.append(VertexData(QVector3D(width_div_2, -width_div_2, -width_div_2), QVector2D(0.0f, 0.0f), QVector3D(0.0f, 0.0f, -1.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, width_div_2, -width_div_2), QVector2D(1.0f, 1.0f), QVector3D(0.0f, 0.0f, -1.0f)));
vertexes.append(VertexData(QVector3D(-width_div_2, -width_div_2, -width_div_2), QVector2D(1.0f, 0.0f), QVector3D(0.0f, 0.0f, -1.0f)));
QVector<GLuint> indexes;
for (int i = 0; i < 24; i += 4){
indexes.append(i + 0);
indexes.append(i + 1);
indexes.append(i + 2);
indexes.append(i + 2);
indexes.append(i + 1);
indexes.append(i + 3);
}
// Create and fill vertex buffer and then -> release
m_vertexBuffer.create();
m_vertexBuffer.bind();
m_vertexBuffer.allocate(vertexes.constData(), vertexes.size() * sizeof(VertexData));
m_vertexBuffer.release();
// Create and fill index buffer and then -> release
m_indexBuffer.create();
m_indexBuffer.bind();
m_indexBuffer.allocate(indexes.constData(), indexes.size() * sizeof(GLuint));
m_indexBuffer.release();
m_texture = new QOpenGLTexture(QImage("://cube.jpg").mirrored());
m_texture->setMinificationFilter(QOpenGLTexture::Nearest);
m_texture->setMagnificationFilter(QOpenGLTexture::Linear);
m_texture->setWrapMode(QOpenGLTexture::Repeat);
}
attribute highp vec4 a_position;
attribute highp vec2 a_textcoord;
attribute highp vec3 a_normal;
uniform highp mat4 MVPMatrix;
uniform highp mat4 modelmatrix;
uniform highp mat4 viewmatrix;
uniform highp mat4 projectionmatrix;
varying highp vec4 v_position;
varying highp vec2 v_texCoord;
varying highp vec3 v_normal;
void main(void)
{
mat4 mv_matrix = viewmatrix*modelmatrix;
gl_Position =projectionmatrix * mv_matrix * a_position;
v_texCoord = a_textcoord;
v_normal = normalize(vec3(mv_matrix *vec4(a_normal, 0.0)));
v_position = a_position;
}
uniform sampler2D qt_Texture0;
varying vec2 qt_TexCoord0;
void main(void)
{
gl_FragColor = texture2D(qt_Texture0, qt_TexCoord0);
//gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question