passing poylNormal, tangent, bitangent to shader
This commit is contained in:
parent
cdf19911f6
commit
30f1a1e627
|
@ -34,6 +34,7 @@ private:
|
||||||
// functions
|
// functions
|
||||||
private:
|
private:
|
||||||
void clearData();
|
void clearData();
|
||||||
|
void setupPipeline(QOpenGLShaderProgram * program);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void drawGeometry(QOpenGLShaderProgram *program);
|
void drawGeometry(QOpenGLShaderProgram *program);
|
||||||
|
|
|
@ -22,6 +22,10 @@ uniform struct Light {
|
||||||
float ambientCoefficient;
|
float ambientCoefficient;
|
||||||
} light;
|
} light;
|
||||||
|
|
||||||
|
attribute vec3 a_polyNorm;
|
||||||
|
attribute vec3 a_polyTan;
|
||||||
|
attribute vec3 a_polyBiTan;
|
||||||
|
|
||||||
varying vec2 v_surfaceUV;
|
varying vec2 v_surfaceUV;
|
||||||
varying vec3 v_surfacePosition;
|
varying vec3 v_surfacePosition;
|
||||||
varying vec3 v_surfaceNormal;
|
varying vec3 v_surfaceNormal;
|
||||||
|
|
|
@ -52,6 +52,58 @@ void GeometryEngine::clearData()
|
||||||
m_drawList.clear();
|
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)
|
void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
|
||||||
{
|
{
|
||||||
if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated())
|
if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated())
|
||||||
|
@ -72,30 +124,9 @@ void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
|
||||||
// Allways use texture unit 0
|
// Allways use texture unit 0
|
||||||
program->setUniformValue("texture", 0);
|
program->setUniformValue("texture", 0);
|
||||||
|
|
||||||
// Offset for position
|
//setup the pipeline
|
||||||
quintptr offset = 0;
|
setupPipeline(program);
|
||||||
|
|
||||||
// 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));
|
|
||||||
|
|
||||||
// Paint
|
// Paint
|
||||||
|
|
||||||
for (auto& it : m_drawList)
|
for (auto& it : m_drawList)
|
||||||
|
|
Loading…
Reference in New Issue