Не отображается куб на сцене. Как я понимаю это из за матриц "отдельно обозначеных " т.к когда была MVPMatrix все работало. Простите за возможно тупой вопрос (я новичок). Помогите пожалуйста исправить
Мои исходники:
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);
}