From 30f1a1e6278cdda904360c42d8421eb72dafc875 Mon Sep 17 00:00:00 2001 From: Anakin Date: Sun, 5 Feb 2017 16:57:12 +0100 Subject: [PATCH] passing poylNormal, tangent, bitangent to shader --- QtMeshViewer/Header/GeometryEngine.h | 1 + QtMeshViewer/Resources/fshader.glsl | 4 ++ QtMeshViewer/Source/GeometryEngine.cpp | 79 ++++++++++++++++++-------- 3 files changed, 60 insertions(+), 24 deletions(-) diff --git a/QtMeshViewer/Header/GeometryEngine.h b/QtMeshViewer/Header/GeometryEngine.h index 7464662..5b551e5 100644 --- a/QtMeshViewer/Header/GeometryEngine.h +++ b/QtMeshViewer/Header/GeometryEngine.h @@ -34,6 +34,7 @@ private: // functions private: void clearData(); + void setupPipeline(QOpenGLShaderProgram * program); public: void drawGeometry(QOpenGLShaderProgram *program); diff --git a/QtMeshViewer/Resources/fshader.glsl b/QtMeshViewer/Resources/fshader.glsl index 4e5d7be..b66d1ed 100644 --- a/QtMeshViewer/Resources/fshader.glsl +++ b/QtMeshViewer/Resources/fshader.glsl @@ -22,6 +22,10 @@ uniform struct Light { float ambientCoefficient; } light; +attribute vec3 a_polyNorm; +attribute vec3 a_polyTan; +attribute vec3 a_polyBiTan; + varying vec2 v_surfaceUV; varying vec3 v_surfacePosition; varying vec3 v_surfaceNormal; diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp index 902f3a5..da2a798 100644 --- a/QtMeshViewer/Source/GeometryEngine.cpp +++ b/QtMeshViewer/Source/GeometryEngine.cpp @@ -52,6 +52,58 @@ void GeometryEngine::clearData() m_drawList.clear(); } +void GeometryEngine::setupPipeline(QOpenGLShaderProgram *program) +{ + // Offset for position + quintptr offset = 0; + + // Tell OpenGL programmable pipeline how to locate vertex position data + int vertexLocation = program->attributeLocation("a_position"); + program->enableAttributeArray(vertexLocation); + program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); + + // Offset for texture coordinate + offset += sizeof(QVector3D); + + // Tell OpenGL programmable pipeline how to locate vertex texture coordinate data + int texcoordLocation = program->attributeLocation("a_texcoord"); + program->enableAttributeArray(texcoordLocation); + program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData)); + + //Offset for vertexNormal + offset += sizeof(QVector2D); + + // Tell OpenGL programmable pipeline how to locate vertex normal data + int vertNormLocation = program->attributeLocation("a_normal"); + program->enableAttributeArray(vertNormLocation); + program->setAttributeBuffer(vertNormLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); + + //Offset for polygonNormal + offset += sizeof(QVector3D); + + // Tell OpenGL programmable pipeline how to locate polygon normal data + int polyNormLocation = program->attributeLocation("a_polyNorm"); + program->enableAttributeArray(polyNormLocation); + program->setAttributeBuffer(polyNormLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); + + //Offset for polygonTangent + offset += sizeof(QVector3D); + + // Tell OpenGL programmable pipeline how to locate polygon tangent data + int polyTanLocation = program->attributeLocation("a_polyTan"); + program->enableAttributeArray(polyTanLocation); + program->setAttributeBuffer(polyTanLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); + + //Offset for polygonBitangent + offset += sizeof(QVector3D); + + // Tell OpenGL programmable pipeline how to locate polygon bitangent data + int polyBiTanLocation = program->attributeLocation("a_polyBiTan"); + program->enableAttributeArray(polyBiTanLocation); + program->setAttributeBuffer(polyBiTanLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); + +} + void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program) { if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated()) @@ -72,30 +124,9 @@ void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program) // Allways use texture unit 0 program->setUniformValue("texture", 0); - // Offset for position - quintptr offset = 0; - - // Tell OpenGL programmable pipeline how to locate vertex position data - int vertexLocation = program->attributeLocation("a_position"); - program->enableAttributeArray(vertexLocation); - program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); - - // Offset for texture coordinate - offset += sizeof(QVector3D); - - // Tell OpenGL programmable pipeline how to locate vertex texture coordinate data - int texcoordLocation = program->attributeLocation("a_texcoord"); - program->enableAttributeArray(texcoordLocation); - program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData)); - - //Offset for normal - offset += sizeof(QVector2D); - - // Tell OpenGL programmable pipeline how to locate vertex normal data - int normLocation = program->attributeLocation("a_normal"); - program->enableAttributeArray(normLocation); - program->setAttributeBuffer(normLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); - + //setup the pipeline + setupPipeline(program); + // Paint for (auto& it : m_drawList)