PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Texture Mapping


Gast
2009-01-09, 11:39:56
Hi,
ich hab einmal einen Code geschrieben mit JOGL und einen mit GLUT. Im Prinzip stehen die gleichen Anweisungen drin, bis das im GLUT Code mit GL_LINEAR gefiltert wird.

Der c++ Teil ist praktisch identisch
private void addVertex3d(GL gl, int i, float j){
Point2D q = p(i,j);
Point2D qdash = pdash(i,j);
double len = qdash.length();
if (lastV != null){
length += q.subtract(lastV).length();
}

if (len == 0) {
len = 1;
}
qdash.x = qdash.x*(extra/2)/len;
qdash.y = qdash.y*(extra/2)/len;

Point2D p1 = new Point2D(q.x-qdash.y, q.y+qdash.x);
Point2D p2 = new Point2D(q.x+qdash.y, q.y-qdash.x);

pol.add(p1);
pol.add(0,p2);


gl.glTexCoord2d(length*scale/100, 0);
gl.glVertex3d(p1.x,1.0d, p1.y);

gl.glTexCoord2d(length*scale/100, 1);
gl.glVertex3d(p2.x, 1.0d,p2.y);

lastV = q;

}
----------
public void render3D(GL gl, GLDrawable glc){
// Pretty much like in 2D
if (fill != null || texture != null){
if (texture == null) {
setColor(gl,fill);
gl.glDisable( GL.GL_TEXTURE_2D );
} else {
Texture gltexture = texture.getTexture(glc);
gltexture.enable();
gl.glTexParameteri( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT );
gl.glTexParameteri( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT );

gl.glTexParameteri( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_LINEAR );
gl.glTexParameteri( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR_MIPMAP_LINEAR );
gl.glTexEnvf( GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE,GL.GL_MODULATE );

gltexture.bind();
}
gl.glPushMatrix();
if(pts2d.size() >= 4){
length = 0.0;
lastV = null;
pol.clear();




gl.glBegin( GL.GL_TRIANGLE_STRIP ); //draw the Bezier
Point2D p0 = pts2d.get(0);
Point2D p1 = pts2d.get(1);
Point2D p2 = pts2d.get(2);
double ycross = (p1.y-p0.y)*(p2.x-p1.x)-(p1.x-p0.x)*(p2.y-p1.y);

if(ycross >= 0){
gl.glNormal3d(0,1,0);
}
else {
gl.glNormal3d(0,-1,0);
}
addVertex3d(gl,0,0);
for (int i = 0; i < pts2d.size()-3; i+=3) {
for (int j = 1; j <= STEPS; j++) {
addVertex3d(gl,i,j/(float)STEPS);
}
}
gl.glEnd();
}

gl.glPopMatrix();
}



}
----------\
c++
void Road::paint()
{
// Black

glPushMatrix();
BMPClass bmp;
cout<<BMPLoad(texture,bmp)<<endl;
glEnable(GL_TEXTURE_2D);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE );

glTexImage2D(GL_TEXTURE_2D,0,3,bmp.width,bmp.height,0,GL_RGB,GL_UNSIGNED_BYTE,bm p.bytes);
if(pts2d.size() >= 4){
length = 0.0;
//lastV = 0;
pol.clear();




glBegin(GL_TRIANGLE_STRIP ); //draw the Bezier
glColor3f(0.0,0.0,0.0);
Point2D p0 = pts2d.at(0);
Point2D p1 = pts2d.at(1);
Point2D p2 = pts2d.at(2);
// Find a normal in the plane
double ycross = (p1.getY()-p0.getY())*(p2.getX()-p1.getX())-(p1.getX()-p0.getX())*(p2.getY()-p1.getY());

if(ycross >= 0){
glNormal3d(0,1,0);
}
else {
glNormal3d(0,-1,0);
}
int STEPS=12;
addVertex3d(0,0);
for (int i = 0; i < pts2d.size()-3; i+=3) {
for (int j = 1; j <= STEPS; j++) {
addVertex3d(i,j/(float)STEPS);
}
}
glEnd();
}

glPopMatrix();
}

In der c++ Version klappt das Mapping nicht. Die Texture ist ueberall, obwohl die gleichen Koordinaten gewaehlt worden sind. Liegt das daran, dass ich bei Java den bmp Loader von JOGL verwende, waehrend ich bei der c++ Version einen bmp Loader verwende, den ich im Netz gefunden habe? Bei einem Test mit einer anderen Texture, die ich auf ein Viereck gepackt habe und die Standartwerte von 0 bis 1 eingehalten habe sieht es bei beiden gleich aus.

Gast
2009-01-09, 16:31:26
Hi,
ich hab einmal einen Code geschrieben mit JOGL und einen mit GLUT. Im Prinzip stehen die gleichen Anweisungen drin, bis das im GLUT Code mit GL_LINEAR gefiltert wird.
[...]
In der c++ Version klappt das Mapping nicht. Die Texture ist ueberall, obwohl die gleichen Koordinaten gewaehlt worden sind. Liegt das daran, dass ich bei Java den bmp Loader von JOGL verwende, waehrend ich bei der c++ Version einen bmp Loader verwende, den ich im Netz gefunden habe? Bei einem Test mit einer anderen Texture, die ich auf ein Viereck gepackt habe und die Standartwerte von 0 bis 1 eingehalten habe sieht es bei beiden gleich aus.
Was heißt "die Textur ist überall"?
Wenn die Textur richtig geladen wird aber verzerrt ist dann passt was mit den Texturkoordinaten nicht, wenn die Textur auch auf Objekten erscheint auf denen sie eigentlich nicht zu sehen sein sollte passt was mit dem GL-State nicht.

Coda
2009-01-09, 17:38:11
Du könntest mal mit gDEBugger schauen ob die Textur richtig geladen ist um die Fehlerquelle schonmal auszuschließen.

Gast
2009-01-10, 00:18:43
Was heißt "die Textur ist überall"?
Wenn die Textur richtig geladen wird aber verzerrt ist dann passt was mit den Texturkoordinaten nicht, wenn die Textur auch auf Objekten erscheint auf denen sie eigentlich nicht zu sehen sein sollte passt was mit dem GL-State nicht.

Die Textur erscheint auf Objekten auf denen sie nicht zu sehen sein soll.

Gast
2009-01-10, 22:46:22
Die Textur erscheint auf Objekten auf denen sie nicht zu sehen sein soll.
Dann passt was mit dem Texturestate nicht.
Unbind mal die Textur nachdem du sie benutzt hast bzw. schau dir den Ablauf an wo du die Textur lädst, wo das binding passiert usw...