I tried to write some simple phong shader but the result looks a bit weird.
I guess that the shader codes are correct and think that the problem is because
of the normals. I calculate them my myself and pass them as vertex normals.
QVector<float> WavefrontObj::calculateNormals(const float *vertices, unsigned int numVertices, const unsigned int *indices, unsigned int numIndices)
{
// Foreach vertice we calculate a normal
QVector<float> vecNormals(numVertices);
for(unsigned int i=0; i<numIndices; )
{
hduVector3Df firstvec = hduVector3Df(&vertices[indices[i+1]*3])-hduVector3Df(&vertices[indices[i]*3]);
hduVector3Df secondvec = hduVector3Df(&vertices[indices[i]*3])-hduVector3Df(&vertices[indices[i+2]*3]);
hduVector3Df normal = crossProduct(firstvec, secondvec);
for(int v=0; v<3; ++v, ++i)
{
unsigned int index = indices[i]*3;
assert(index<numVertices && "Error in vertices");
vecNormals[index]-=normal[0];
vecNormals[index+1]-=normal[1];
vecNormals[index+2]-=normal[2];
}
}
// Normalize all normals
for(int i=0; i<vecNormals.size(); i+=3)
{
hduVector3Df normal(&vecNormals[i]);
normal.normalize();
vecNormals[i]=-normal[0];
vecNormals[i+1]=-normal[1];
vecNormals[i+2]=-normal[2];
}
return vecNormals;
}
The model looks like this
Is there a better way to calculate the normals? I tried calculating them using the geometry shader but this gives the image a facet look.
Thanks for any hints,
bbuerger






