Sphère mappage de texture (opengl et c++)
Je suis en train d'ajouter une texture à une sphère, il fonctionne, mais je reçois un message d'erreur. Ci-dessous est une photo de ce que je reçois,
Je ne sais pas ce que cela GL error: Invalid operation
d'erreur fait référence. Je pense que cela a à voir avec mon code. Je ne suis pas sûr si je suis en train de lire à partir de mon fichier correctement.
Voici le code que j'utilise le dessin de cette sphère.
glTranslate(0.0f, 0.0f, 0.0f);
glRotate(sunRot,0.0,0.0,1.0);
drawAroundPlanetGrid(100, 1, 50, 50, 1);
glPopMatrix();`
Voici ce que le drawAroundPlanetGrid()
ressemble.
void drawAroundPlanetGrid(double radius, int overSample, int numStrips, int numQuads, float radiusRatio)
{
GLMaterial test;
GLuint surf;
GLuint* surface;
Images::RGBImage surfaceImage;
surfaceImage=Images::readImageFile("/home/rodrtu/Desktop/SolarSystem/EarthTopography.png",Vrui::openFile("/home/rodrtu/Desktop/SolarSystem/EarthTopography.png"));
glEnable(GL_TEXTURE_2D);
//glGenTextures(1, surface);
glBindTexture(GL_TEXTURE_2D, surf);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
surfaceImage.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB);
double b = radius * 0.9966463577;//Geoid's semi-minor axis
double e2 = 0.0067; //Geoid's squared eccentricity, derived from flattening factor
float texY1=float(0)/float(numStrips);
double lat1=(Math::Constants<double>::pi*double(0))/double(numStrips)-0.5*Math::Constants<double>::pi;
double s1=Math::sin(lat1);
double c1=Math::cos(lat1);
double chi1=Math::sqrt(1.0-e2*s1*s1);
double xy1=radius*radiusRatio/chi1*c1;
double z1=radius*(1.0-e2)/chi1*s1;
//* Draw latitude quad strips: *
for(int i=1;i<numStrips+1;++i)
{
float texY0=texY1;
double s0=s1;
double c0=c1;
double xy0=xy1;
double z0=z1;
texY1=float(i)/float(numStrips);
lat1=(Math::Constants<double>::pi*double(i))/double(numStrips)-0.5*Math::Constants<double>::pi;
s1=Math::sin(lat1);
c1=Math::cos(lat1);
chi1=Math::sqrt(1.0-e2*s1*s1);
xy1=radius/chi1*c1;
z1=radius*(1.0-e2)/chi1*s1;
glBegin(GL_QUAD_STRIP);
for(int j=0;j<=numQuads;++j)
{
float texX=float(j)/float(numQuads)+0.5f;
double lng=(2.0*Math::Constants<double>::pi*double(j))/double(numQuads);
double cl=Math::cos(lng)*radiusRatio;
double sl=Math::sin(lng)*radiusRatio;
glTexCoord2f(texX,texY1);
glNormal3d(c1*cl,c1*sl,s1);
glVertex3d(xy1*cl,xy1*sl,z1);
glTexCoord2f(texX,texY0);
glNormal3d(c0*cl,c0*sl,s0);
glVertex3d(xy0*cl,xy0*sl,z0);
}
glEnd();
}
glEndList();
}
Je m'excuse si mon code est difficile à lire. Laissez-moi savoir si vous voyez quel est le problème avec mon code. J'ai essayé de faire la lecture de cette erreur, mais il apparaît toujours. Des idées pourquoi?
c'est là:
surfaceImage.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB);
Les Images? Quel objet est qui?
Vous suggérons de lancer votre programme sous un débogueur et attraper la fonction qui génère cette erreur.
Question idiote, mais êtes-vous pousser une matrice sur le tapis à n'importe quel point? Je vois où vous pop, mais peut-être que je vais manquer où vous avez poussé un avant que.
OriginalL'auteur TRod | 2013-05-20
Vous devez vous connecter pour publier un commentaire.
Que la documentation de glBindTexture états ", Vous devez utiliser glGenTextures pour générer un ensemble de nouvelle texture noms.". Cela signifie que vous avez à remplir votre "surface" variable avec une pièce d'texture nom en premier. C'est probablement l'endroit où votre GL vient l'erreur. D'autre part, vous délier la texture de nouveau avant de l'utiliser en appelant "glBindTexture(GL_TEXTURE_2D,0)". Troisièmement, pour comprendre ce qui est à l'origine de la GL d'erreur sur votre propre, il est une bonne idée de créer une macro qui appelle glGetError et imprime un message de log si il y avait une erreur. Que vous pouvez propager cette macro entre les appels à la GL pour affiner où l'erreur s'est produite.
glGenTextures
à mon programme mais il n'a pas vraiment faire beaucoup. C'était la même avec ou sans elle. L'pensé a montré jusqu'à quand j'ai ajoutéglEnable(GL_TEXTURE_2D);
; cependant je ne suis toujours pas sûr de ce que le GL erreur est. J'ai fait ce que vous avez suggéré et imprimé les glGetError tous sur le programme, mais ça tire de partout comme0
. Je ne suis pas sûr de ce que cela signifie, et de ce que j'ai vu en ligne, cela pourrait signifier quoi que ce soit. Même qu'il n'a pas d'erreurs, ce qui n'est pas vrai, apparemment. auriez-vous une autre suggestion sur ce que je pouvais faire? Je vous remercie beaucoup pour l'aideJe suis confus par les vagues et la surface? Essayez quelque chose comme glGenTextures(1, &surf); glBindTexture(GL_TEXTURE_2D, surf);
ce n'était pas la compilation se plaindre, donc j'ai essayé de faire ça, mais j'ai oublié d'ajouter le
&
à la variable. Il n'est toujours pas à se débarrasser de l'erreur. Je ne suis pas vraiment sûr de ce qu'il est. Le programme affiche la "Terre", mais l'erreur continue de s'exécuter en arrière-plan. Je suis désolé de vous déranger avec cela. Merci pour l'aide siPeut-être il ya une autre façon de lire mon fichier?
Elle peut se produire dans une autre partie de votre code. Autant que je sache, opengl ne pas imprimer les erreurs par lui-même. Vous devez avoir quelque chose comme printf("GL erreur: %s",...);
OriginalL'auteur nhkode
Le problème dans ce code a été de cette ligne de
glEndList();
. Une fois que je l'ai enlevé le programme fonctionne sans erreurs.Ça fait deux ans. Je sais que j'ai le code, j'ai juste ne peux pas me rappeler où. Je vais avoir à la chercher. Quand avez-vous besoin? Je n'ai pas de problème de partage de code avec vous.
Je vous remercie pour votre générosité. J'en ai besoin dès que possible. En fait j'ai déjà le code et ce que j'ai besoin est de savoir comment manipuler la latitude et de la longitude.
OriginalL'auteur TRod