저는 Qt에서 쉐이더 및 간단한 버텍스 배열을 사용하여 OpenGL을 사용하려고했습니다. 기본적으로 화면 중간에 그려지는 평야를 원하지만 프로그램을 실행할 때 아무 것도 나타나지 않습니다. 나는 Qt의 "Texture"예제에서 내 코드를 기반으로하고 있습니다. 모든 것이 나에게 똑같아 보이지만 작동하지 않습니다!OpenGL + Qt 4.8은 무언가를 그리지 않습니다
attribute highp vec4 vertices;
attribute highp mat4x4 modelmatrix;
void main (void)
{
gl_Position= modelmatrix*vertices;
}
그리고 내 fShader :
void main(void)
{
gl_FragColor= vec4(0.0, 0.1, 1.0, 1.0);
}
당신이 오류를 보입니까
#include "glwidget.h"
GLWidget::GLWidget(QWidget *parent):QGLWidget(parent)
{
timer.start(10);
//connect(&timer, SIGNAL(timeout()), this, SLOT(updateGL()));
Object aux;
QVector3D auxV;
auxV.setX(0.4); auxV.setY(0.4); auxV.setZ(1.0);
aux.vertices.append(auxV);
auxV.setX(0.4); auxV.setY(-0.4); auxV.setZ(1.0);
aux.vertices.append(auxV);
auxV.setX(-0.4); auxV.setY(-0.4); auxV.setZ(1.0);
aux.vertices.append(auxV);
auxV.setX(-0.4); auxV.setY(-0.4); auxV.setZ(1.0);
aux.vertices.append(auxV);
Objects.append(aux);
}
GLWidget::~GLWidget()
{
}
void GLWidget::initializeGL()
{
#define PROGRAM_VERTEX_ATTRIBUTE 0
printf("Objects Size: %d\nObj1 Size: %d\n", Objects.size(), Objects.at(0).vertices.size());
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
//printf("Version: %s\n", glGetString(GL_VERSION));
vShader= new QGLShader (QGLShader::Vertex, this);
vShader->compileSourceFile("../src/shaders/editorVshader.glsl");
fShader= new QGLShader (QGLShader::Fragment, this);
fShader->compileSourceFile("../src/shaders/editorFshader.glsl");
editor= new QGLShaderProgram (this);
editor->addShader(vShader);
editor->addShader(fShader);
editor->bindAttributeLocation("vertices", PROGRAM_VERTEX_ATTRIBUTE);
editor->link();
editor->bind();
}
void GLWidget::paintGL()
{
glClearColor(0.4765625, 0.54296875, 0.6171875, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -10.0f);
glVertexPointer(3, GL_FLOAT, 0, Objects.at(0).vertices.constData());
glEnableClientState(GL_VERTEX_ARRAY);
QMatrix4x4 auxM;
auxM.ortho(-0.5, 0.5, 0.5, -0.5, 4.0, -15.0);
auxM.translate(0.0f, 0.0f, -10.0f);
editor->setUniformValue("modelmatrix", auxM);
editor->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE);
//editor->enableAttributeArray(editor->attributeLocation("vertices"));
//editor->setAttributeArray(editor->attributeLocation("vertices"), Objects.at(0).vertices.constData(), 3);
editor->setAttributeArray (PROGRAM_VERTEX_ATTRIBUTE, Objects.at(0).vertices.constData());
glDrawArrays(GL_QUADS, 0, 4);
}
void GLWidget::resizeGL(int w, int h)
{
int side = qMin(w, h);
glViewport((w - side)/2, (h - side)/2, side, side);
//glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-0.5, 0.5, -0.5, 0.5, 4.0, -15.0);
glMatrixMode(GL_MODELVIEW);
updateGL();
}
그리고 여기 내 vShader 있습니다 : 여기
내 glwidget.cpp의 코드입니다 그곳에?
쉐이더가 완전히 혼란 스럽습니다. GLSL 1.10에서는'highp' 정밀도 한정자를 사용할 수 없으며, 마찬가지로'mat4x4'는 1.10에 존재하지 않습니다. 최소한 #version 120을 포함시켜야합니다. OpenGL ES 쉐이더와 데스크탑 GL을 섞어서 일치 시키려고 했습니까? –
맞습니다. mat4x4가 잘못되었습니다. 나는 그것을 바꿨다. 하지만 본질적으로 예제와 같은 쉐이더를 사용하고 있습니다. #version을 사용하지도 않습니다. (Qt의 다른 프로그램에서도 사용 했었습니다.) 그들은 작동합니다. – BlastDV
다른 주목해야 할 것은 modelmatrix가 속성이 아닌 균일 한 값으로 전달된다는 것입니다. 그것은 변경되었지만 여전히 작동하지 않습니다. – BlastDV