Jump to content

  • Log In with Google      Sign In   
  • Create Account

GLSL Shader


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 bbuerger   Members   -  Reputation: 100

Like
0Likes
Like

Posted 26 April 2012 - 02:19 AM

Hi there,

I tried to write some simple phong shader but the result looks a bit weird.
Wrong.png

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
WireView.png

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

Attached Thumbnails

  • Wrong.png
  • WireView.png


Sponsor:

#2 RobinsonUK   Members   -  Reputation: 108

Like
0Likes
Like

Posted 26 April 2012 - 10:30 AM

Are you sharing vertices between edges? If you are, you'll have problems because the normal on the outside flat surface needs to be different to the normal on the inside circular surface.

#3 dpadam450   Members   -  Reputation: 923

Like
0Likes
Like

Posted 26 April 2012 - 11:11 AM

Flat edges should NEVER share vertices. You need to manually in a 3d program separate the inner cylinder from the rest of the model, then separate all flat sides of the remaining cube.

#4 bbuerger   Members   -  Reputation: 100

Like
0Likes
Like

Posted 26 April 2012 - 03:57 PM

Yes I have no duplicate edges. Thanks for the hints then I will recreate my model or search for a program that create duplicate vertices if the angle is too big.

#5 bbuerger   Members   -  Reputation: 100

Like
0Likes
Like

Posted 27 April 2012 - 04:58 AM

Ok this solved the problem.
Blender has a modifier edge split that can reinsert the missing vertices automatically.
Thanks for the good advice.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS