QOpenGLWidget 不绘制数组
QOpenGLWidget not drawing array
你是我解决这个问题的最后手段,因为我没有想法。
所以首先,我已经完成了一些 openGL 的工作,但没有使用 Qt 库。
由于 Qt Android 编译器,我必须使用 Qt 库来完成它,所以我没有办法。
所以我尝试像在普通 openGL 中那样绘制一些顶点坐标。
将点保存在浮点数组等中。
所以我满怀希望地制作了正确的 vao、vbo.. shader.. 但它不会绘制任何东西。
paintGL() 仅在使用 glBegin 和 end 进行硬编码时才绘制内容。
请告诉我哪里做错了,让我从痛苦中解脱^^
啊,是的,已经有像我这样的问题 但没有答案所以我想再试一次。
--MainWidget Header:
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QVector2D>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QVector3D>
#include <QOpenGLVertexArrayObject>
class MainWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
protected:
void initializeGL() Q_DECL_OVERRIDE;
void resizeGL(int w, int h) Q_DECL_OVERRIDE;
void paintGL() Q_DECL_OVERRIDE;
GLfloat vertices[9];
private:
QOpenGLShaderProgram program;
QOpenGLBuffer arrayBuf;
QOpenGLVertexArrayObject vertexArrayID;
};
#endif // MAINWIDGET_H
-- MainWidget Cpp:
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent): QOpenGLWidget(parent){
}
MainWidget::~MainWidget(){
}
void MainWidget::initializeGL(){
initializeOpenGLFunctions();
glClearColor(0, 0, 0.4f, 0);
glEnable(GL_DEPTH_TEST);
//glEnable(GL_CULL_FACE);
static const GLfloat g_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
for(int i = 0; i < 9; i++){
vertices[i] = g_vertex_buffer_data[i];
}
vertexArrayID.create();
vertexArrayID.bind();
program.addShaderFromSourceFile(QOpenGLShader::Vertex, "vertex.vert");
program.addShaderFromSourceFile(QOpenGLShader::Fragment, "fragment.frag");
program.link();
program.bind();
arrayBuf.create();
arrayBuf.bind();
arrayBuf.allocate(&vertices, 9 * sizeof(GLfloat));
/* glGenBuffers(1, &arrayBuf);
glBindBuffer(GL_ARRAY_BUFFER, arrayBuf);*/
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
}
void MainWidget::resizeGL(int w, int h){
}
void MainWidget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
arrayBuf.bind();
arrayBuf.allocate(&vertices, 9*sizeof(GLfloat));
int vertexLocation = program.attributeLocation("vertex");
program.enableAttributeArray("vertexLocation");
program.setAttributeBuffer(vertexLocation, GL_FLOAT, 0, 3, sizeof(GLfloat) );
//glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
}
--主要 Cpp:
#include <QApplication>
#include <QLabel>
#include <QSurfaceFormat>
#ifndef QT_NO_OPENGL
#include "mainwidget.h"
#endif
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSurfaceFormat format;
format.setDepthBufferSize(24);
QSurfaceFormat::setDefaultFormat(format);
app.setApplicationName("GLtest");
#ifndef QT_NO_OPENGL
MainWidget widget;
widget.show();
#else
QLabel note("OpenGL Support required");
note.show();
#endif
return app.exec();
}
--尽可能简单的顶点着色器:
#version 330
layout(location = 0) in vec3 vertex;
void main(){
gl_Position = vec4(vertex, 1.0);
}
--片段着色器:
#version 330
out vec3 color;
void main(){
color = vec3(1,0,0);
}
提前致谢..欢迎任何形式的帮助!
干杯
您启用了错误的顶点属性:
program.enableAttributeArray("vertexLocation");
它应该是(不是丢失的“)
program.enableAttributeArray(vertexLocation);
或(正确名称)
program.enableAttributeArray("vertex");
你是我解决这个问题的最后手段,因为我没有想法。 所以首先,我已经完成了一些 openGL 的工作,但没有使用 Qt 库。
由于 Qt Android 编译器,我必须使用 Qt 库来完成它,所以我没有办法。
所以我尝试像在普通 openGL 中那样绘制一些顶点坐标。 将点保存在浮点数组等中。 所以我满怀希望地制作了正确的 vao、vbo.. shader.. 但它不会绘制任何东西。 paintGL() 仅在使用 glBegin 和 end 进行硬编码时才绘制内容。
请告诉我哪里做错了,让我从痛苦中解脱^^
啊,是的,已经有像我这样的问题
--MainWidget Header:
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QVector2D>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QVector3D>
#include <QOpenGLVertexArrayObject>
class MainWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
protected:
void initializeGL() Q_DECL_OVERRIDE;
void resizeGL(int w, int h) Q_DECL_OVERRIDE;
void paintGL() Q_DECL_OVERRIDE;
GLfloat vertices[9];
private:
QOpenGLShaderProgram program;
QOpenGLBuffer arrayBuf;
QOpenGLVertexArrayObject vertexArrayID;
};
#endif // MAINWIDGET_H
-- MainWidget Cpp:
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent): QOpenGLWidget(parent){
}
MainWidget::~MainWidget(){
}
void MainWidget::initializeGL(){
initializeOpenGLFunctions();
glClearColor(0, 0, 0.4f, 0);
glEnable(GL_DEPTH_TEST);
//glEnable(GL_CULL_FACE);
static const GLfloat g_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
for(int i = 0; i < 9; i++){
vertices[i] = g_vertex_buffer_data[i];
}
vertexArrayID.create();
vertexArrayID.bind();
program.addShaderFromSourceFile(QOpenGLShader::Vertex, "vertex.vert");
program.addShaderFromSourceFile(QOpenGLShader::Fragment, "fragment.frag");
program.link();
program.bind();
arrayBuf.create();
arrayBuf.bind();
arrayBuf.allocate(&vertices, 9 * sizeof(GLfloat));
/* glGenBuffers(1, &arrayBuf);
glBindBuffer(GL_ARRAY_BUFFER, arrayBuf);*/
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
}
void MainWidget::resizeGL(int w, int h){
}
void MainWidget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
arrayBuf.bind();
arrayBuf.allocate(&vertices, 9*sizeof(GLfloat));
int vertexLocation = program.attributeLocation("vertex");
program.enableAttributeArray("vertexLocation");
program.setAttributeBuffer(vertexLocation, GL_FLOAT, 0, 3, sizeof(GLfloat) );
//glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
}
--主要 Cpp:
#include <QApplication>
#include <QLabel>
#include <QSurfaceFormat>
#ifndef QT_NO_OPENGL
#include "mainwidget.h"
#endif
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSurfaceFormat format;
format.setDepthBufferSize(24);
QSurfaceFormat::setDefaultFormat(format);
app.setApplicationName("GLtest");
#ifndef QT_NO_OPENGL
MainWidget widget;
widget.show();
#else
QLabel note("OpenGL Support required");
note.show();
#endif
return app.exec();
}
--尽可能简单的顶点着色器:
#version 330
layout(location = 0) in vec3 vertex;
void main(){
gl_Position = vec4(vertex, 1.0);
}
--片段着色器:
#version 330
out vec3 color;
void main(){
color = vec3(1,0,0);
}
提前致谢..欢迎任何形式的帮助! 干杯
您启用了错误的顶点属性:
program.enableAttributeArray("vertexLocation");
它应该是(不是丢失的“)
program.enableAttributeArray(vertexLocation);
或(正确名称)
program.enableAttributeArray("vertex");