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