2016-08-23 24 views
-1

私はQtで行われたインターフェイスとゲームプレイシーン(3Dマップ、キャラクター、モンスター)でダンジョンクローラー/不正なものを作るためにQt(5.6.0)を使用しています。 。)OpenGLで。ビューは昇格したQWidgetであり、古いglBegin/glEndメソッドを使用して描画できますが、glDrawArraysまたはglDrawElementsを使用しようとするたびに空白の画面が表示されます。QT OpenGL、glDrawElementsとglDrawArrayは空白の画面しか表示しません

クリアカラーが動作していて、黒より少し軽く設定されているため、黒い形状が表示されるはずです。私は、同じ頂点でテストするためにglBegin/glEndメソッドを使用しています。 QOpenGLShaderProgramオブジェクトとQOpenGLVertexArrayObjectオブジェクトをQOpenGLShaderProgram Qtドキュメントの例とともに使用するために、Jamie Kingで示されているように多かれ少なかれ直線的なOpenGLアプローチを試しました。さらにいくつかの例とチュートリアルを最後にthis exampleで終了しました。現在、initializeGL関数のシェーダコードは、glBegin/glEnd三角形が描画されないようにしています。

現在のコード:

oglwidget.cpp:

#include "GL/glew.h" 
#include "GL/glext.h" 
#include "oglwidget.h" 
#include "general.h" 

#define BUFFER_OFFSET(bytes) ((GLubyte*) NULL + (bytes)) 

extern const char * vertexShader; 
extern const char * fragmentShader; 

OGLWidget::OGLWidget(QWidget *parent): QOpenGLWidget(parent){ 

} 

OGLWidget::~OGLWidget(){ 

} 

void OGLWidget::initializeGL(){ 
    QOpenGLFunctions gl; 
    gl.initializeOpenGLFunctions(); 
    cout<<"Init"<<endl; 
    //-----Create Shader 
    shader2.create(); 
    shader2.addShaderFromSourceCode(QOpenGLShader::Vertex,vertexShader); 
    shader2.addShaderFromSourceCode(QOpenGLShader::Fragment,fragmentShader); 
    shader2.link(); 
    shader2.bind(); 
    int vertexLocation = shader2.attributeLocation("vertex"); 
    int matrixLocation = shader2.uniformLocation("matrix"); 
    int colorLocation = shader2.uniformLocation("color"); 
    QMatrix4x4 pmvMatrix; 
    pmvMatrix.ortho(rect()); 
    QColor color(0, 255, 0, 255); 

    shader2.enableAttributeArray(vertexLocation); 
    shader2.setAttributeArray(vertexLocation, verts, 3); 
    shader2.setUniformValue(matrixLocation, pmvMatrix); 
    shader2.setUniformValue(colorLocation, color); 

    //-----Create VAO2 
    VAO2=new QOpenGLVertexArrayObject(this); 
    VAO2->create(); 
    VAO2->bind(); 
    //-----Create VBO2 
    VBO2.create(); 
    VBO2.setUsagePattern(QOpenGLBuffer::StaticDraw); 
    VBO2.bind(); 
    VBO2.allocate(verts,sizeof(verts)); 
} 

void OGLWidget::paintGL(){ 
    cout<<"Painting"<<endl; 
    QOpenGLFunctions gl; 
    gl.initializeOpenGLFunctions(); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(0.05,0.05,0.05,1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0.0f,0.0f,-2.0f); 

    //draw(); 
    shader2.bind(); 
    VAO2->bind(); 
    glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_INT,inds); 
    VAO2->release(); 
} 


void OGLWidget::resizeGL(int w, int h){ 
    cout<<"Resizing"<<endl; 
    glViewport(0,0,w,h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    //glFrustum (-1.0, 1.0, -1.0, 1.0, 1, 1000.0); //-----Assuming this is right? 
    glOrtho(-5,5,-5,5,-5,5); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 
int OGLWidget::loadModel(string path){ 
    //-----loads the model path if not already loaded, returns the index of the model 
    //---check if already loaded 
    for(int p=0;p<loadedPaths.size();p++){ 
     if(!loadedPaths[p].compare(path)){ 
      return p; 
     } 
    } 
    loadedPaths.push_back(path); 
    //-----continue with path loading 
    Model m; 
    m.loadModel(path); 
    return loadedPaths.size()-1; 
} 

void OGLWidget::draw(){ 
    cout<<"drawing..."<<endl; 
    glBegin(GL_TRIANGLES); 
    for(int i=0;i<sizeof(verts)/sizeof(GLfloat);i+=3){ 
     //cout<<i<<endl; 
     glVertex3f(verts[i],verts[i+1],verts[i+2]); 
    } 
    glEnd(); 
} 

oglwidget.h:

#ifndef OGLWIDGET_H 
#define OGLWIDGET_H 

#include <QWidget> 
#include <QOpenGLWidget> 
#include <glm/glm.hpp> 
#include <QOpenGLFunctions> 
#include <vector> 
#include "entity.h" 
#include "general.h" 
#include <qopenglfunctions_3_3_core.h> 
//#include <GL/glu.h> 
//#include <GL/gl.h> 

#define VERTEXATTR 0 
#define INDEXATTR 1 
#define POSITIONATTR 2 
#define ROTATIONATTR 3 

using namespace std; 


class OGLWidget : public QOpenGLWidget 
{ 
    //QOpenGLFunctions gl; 
    //QOpenGLFunctions_3_3_Core core; 
    QOpenGLVertexArrayObject *VAO2; 
    QOpenGLBuffer VBO2; 
    QOpenGLShaderProgram shader2; 
    QOpenGLContext *m_context; 
    vector<GLuint>statics; //-----buffer number for static models 
    vector<GLuint>dynamics; //-----buffer number of dynamic models 

    vector<GLfloat[1]>staticVerts; //-----vertex data for static models 
    vector<GLfloat[1]>dynamicVerts; //-----vertex data for dynamic models 

    vector<vector<GLfloat>*>staticPos; //-----position data for static models 
    vector<vector<GLfloat>*>dynamicPos; //-----position data for dynamic models 

    vector<GLfloat>staticRot; //-----rotation data for static models 
    vector<GLfloat>dynamicRot; //-----rotation data for dynamic models 

    vector<string>loadedPaths; //-----name in folder of matching VBO 
    GLuint VBO; 
    GLuint IND; 
    GLuint FragID; 
    GLuint VertID; 
    GLuint shader; 

    //-----Testing 
    GLfloat verts[9]={-1.0f, 0.0f, 0.0f, 
         0.0f, 1.0f, 0.0f, 
         1.0f, 0.0f, 0.0f}; 
    GLuint inds[3]={0,1,2}; 

public: 
    OGLWidget(QWidget *parent = 0); 
    ~OGLWidget(); 
    int loadModel(string path); 
private: 
    void draw(); 
    QGLShaderProgram m_shader; 
    QGLBuffer m_vertexBuffer; 

protected: 
    void initializeGL(); 
    void resizeGL(int w, int h); 
    void paintGL(); 
}; 

#endif // OGLWIDGET_H 

shader.cpp:

const char * vertexShader= 
     "attribute highp vec4 vertex;\n" 
     "uniform highp mat4 matrix;\n" 
     "void main(void)\n" 
     "{\n" 
     " gl_Position = matrix * vertex;\n" 
     "}"; 
const char * fragmentShader= 
     "uniform mediump vec4 color;\n" 
     "void main(void)\n" 
     "{\n" 
     " gl_FragColor = color;\n" 
     "}"; 

私が何を読んでから、 (私が間違っている場合は私を修正します) VAOを使用して頂点、色、テクスチャおよび他のデータをGPUメモリにロードし、描画する前にVAOを再バインドし、glDrawArraysまたはglDrawElementsを使用して描画し、VAOを解放します。関数のインデックス付きバージョンを使用すると、同じオブジェクト(つまり、ゲームタイル)の大量のレンダリングが速く、GL_DYNAMIC_DRAWを使用して頻繁に更新されないオブジェクトにはGL_STATIC_DRAWを使用する必要があります。他のすべてのために。

私は本当に簡単な運動でなければならないものを私が逃しているか間違っているか知りたいです。私はこれを少なくとも5回以上やり直してしまいました。

  • OS:Debianのテスト
  • GPU:GeForceは610メートル
  • OpenGLのコア:3.3
  • のQt:5.6
  • ソフトウェア:Qtの創造主で@PeterTへ
+0

)あなたはglGetError(とエラーチェックを追加しようとしたことがありますか? –

+0

あなたはバオをバインドした後に頂点のものをバインドする必要があります(バオはバインディングを格納するためにそこにあります)。あなたは、ウィンドウ座標を表示するために正投影を設定します(左上は0、下側は正のy)が、座標は約1ピクセルの約[0-1]になります。また、バッファと配列の両方を頂点属性(バッファのみである必要があります)としてバインドしようとしています – PeterT

+0

最後のポイントは 'setAttributeBuffer'ではなく' setAttributeArray'です(明らかにバッファをバインドした後に行います) – PeterT

答えて

0

ソリューションのおかげでコメント:シェーダenableAttributeArrayとsetAttributeBuffer(setAttributeArrayから変更)をVBO割り当ての後に移動し、頂点座標とorthoを「より大きい」ように変更します。

void OGLWidget::initializeGL() 
{ 
    QOpenGLFunctions gl; 
    gl.initializeOpenGLFunctions(); 
    glDisable(GL_CULL_FACE); 
    cout<<"Init"<<endl; 
    shader2.create(); 
    shader2.addShaderFromSourceCode(QOpenGLShader::Vertex,vertexShader); 
    shader2.addShaderFromSourceCode(QOpenGLShader::Fragment,fragmentShader); 
    shader2.link(); 
    shader2.bind(); 
    int vertexLocation = shader2.attributeLocation("vertex"); 
    int matrixLocation = shader2.uniformLocation("matrix"); 
    int colorLocation = shader2.uniformLocation("color"); 
    QMatrix4x4 pmvMatrix; 
    //pmvMatrix.ortho(rect()); 
    pmvMatrix.ortho(-100,100,-100,100,-1000,1000); 
    QColor color(0, 255, 0, 255); 

    shader2.enableAttributeArray(vertexLocation); 
    shader2.setUniformValue(matrixLocation, pmvMatrix); 
    shader2.setUniformValue(colorLocation, color); 

    //-----Create VAO2 
    VAO2=new QOpenGLVertexArrayObject(this); 
    VAO2->create(); 
    VAO2->bind(); 

    VBO2.create(); 
    VBO2.setUsagePattern(QOpenGLBuffer::StaticDraw); 
    VBO2.bind(); 
    VBO2.allocate(verts,sizeof(verts)); 

    shader2.enableAttributeArray("vertex"); 
    shader2.setAttributeBuffer("vertex",GL_FLOAT,0,3,0); 
} 

*

GLfloat verts[9]={-100.0f, 0.0f, 30.0f, 
         0.0f, 100.0f, 50.0f, 
         100.0f, 0.0f, 30.0f}; 
関連する問題