Jump to content

  • Log In with Google      Sign In   
  • Create Account

Opengl - Texture problem


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
2 replies to this topic

#1 Shawn619   Members   -  Reputation: 342

Like
0Likes
Like

Posted 17 March 2012 - 12:03 AM

This problem came when i tried to add textures. I'm only only dealing with .bmp file types atm. So i started by adding the 'imageloader.cpp' and 'imageloader.h', then i added the following variable and function:
GLuint _textureId; //The id of the texture
GLuint loadTexture(Image* image) {
GLuint textureId;
glGenTextures(1, &textureId); //Make room for our texture
glBindTexture(GL_TEXTURE_2D, textureId); //Tell OpenGL which texture to edit
//Map the image to the texture
glTexImage2D(GL_TEXTURE_2D,				//Always GL_TEXTURE_2D
	 0,							//0 for now
	 GL_RGB,					   //Format OpenGL uses for image
	 image->width, image->height,  //Width and height
	 0,							//The border of the image
	 GL_RGB, //GL_RGB, because pixels are stored in RGB format
	 GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, because pixels are stored
					   //as unsigned numbers
	 image->pixels);			   //The actual pixel data
return textureId; //Returns the id of the texture
}
And that function code was taken directly from a reputable website(videotutorialsrock.com) so i dont suspect that to be any problem.
Then i added code to my init() function:
void initRendering() {
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING); //Enable lighting
glEnable(GL_LIGHT0);
// images
Image* image = loadBMP("vtr.bmp");
_textureId = loadTexture(image);
delete image;
}
At this point i checked that everything is working fine and there is no problems loading the images.
Next i enable 2d textures to prepare and draw my texture on my quad:
void drawFloor(){
float size = 20.0;
float startX = -60.0f;
float startZ = 60.0f;
//glPushMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
for(int x = 0;x < 6; x++){
  for(int z = 0;z < 6; z++){
   glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f);
   glVertex3f(startX + size*x, 0.0f, startZ + -size*z);//bottom-left
	glTexCoord2f(0.0f, 0.0f);
   glVertex3f(startX + size + size*x, 0.0f, startZ + -size*z);//bottom-right
	glTexCoord2f(0.0f, 0.0f);
   glVertex3f(startX + size + size*x, 0.0f, startZ + -size + -size*z);//top-right
	glTexCoord2f(0.0f, 0.0f);
   glVertex3f(startX + size*x, 0.0f, startZ + -size + -size*z);//top-left
   glEnd();
  }
}
glDisable(GL_TEXTURE_2D);
//glPopMatrix();
}
I should note that there is nothing wrong with the for-loops and structure, it works fine without textures and just color.
This produces my quads without texture, and with a color that i havent defined anywhere previously in my program (Bright Red):
Posted Image
I tried googling this issue and found that it's the result of multiplying colors in my program that i already have and this causes this issue. And people were using "glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);" to overcome this issue, so i did as well, but it isnt working.
When i dont use "glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);", i get a darkish-red color for my quads which is a color i havent previously defined anywhere else in my program:
Posted Image
Full code:
#include <iostream>
#include <stdlib.h>
#include <gl/glut.h>
#include "imageloader.h"
using namespace std;
//variables
float xpos = 0, ypos = 0, zpos = 0, xrot = 0, yrot = 0;//camera rotation angles
float _angle = -70.0f;
float lastx, lasty;//mouse
GLfloat lightPos1[] = {0.0f, 0.0f, 0.0f, 1.0f};//light position
GLuint _textureId; //The id of the texture
GLuint loadTexture(Image* image) {
GLuint textureId;
glGenTextures(1, &textureId); //Make room for our texture
glBindTexture(GL_TEXTURE_2D, textureId); //Tell OpenGL which texture to edit
//Map the image to the texture
glTexImage2D(GL_TEXTURE_2D,				//Always GL_TEXTURE_2D
	 0,							//0 for now
	 GL_RGB,					   //Format OpenGL uses for image
	 image->width, image->height,  //Width and height
	 0,							//The border of the image
	 GL_RGB, //GL_RGB, because pixels are stored in RGB format
	 GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, because pixels are stored
					   //as unsigned numbers
	 image->pixels);			   //The actual pixel data
return textureId; //Returns the id of the texture
}
//Called when a key is pressed
void handleKeypress(unsigned char key, int x, int y) {

	if (key=='q')
	 {
	 xrot += 1;
	 if (xrot >360) xrot -= 360;
	 }

	if (key=='z')
	 {
	 xrot -= 1;
	 if (xrot < -360) xrot += 360;
	 }

if (key=='w')
	 {
	 float xrotrad, yrotrad;
	 yrotrad = (yrot / 180 * 3.141592654f);
	 xrotrad = (xrot / 180 * 3.141592654f);
	 xpos += float(sin(yrotrad)) ;
	 zpos -= float(cos(yrotrad)) ;
	 ypos -= float(sin(xrotrad)) ;
	 }

	if (key=='s')
	 {
	 float xrotrad, yrotrad;
	 yrotrad = (yrot / 180 * 3.141592654f);
	 xrotrad = (xrot / 180 * 3.141592654f);
	xpos -= float(sin(yrotrad));
	 zpos += float(cos(yrotrad)) ;
	 ypos += float(sin(xrotrad));
	 }

	if (key=='d')
	 {
	 float yrotrad;
	 yrotrad = (yrot / 180 * 3.141592654f);
	 xpos += float(cos(yrotrad)) * 0.2;
	 zpos += float(sin(yrotrad)) * 0.2;
	 }

	if (key=='a')
	 {
	 float yrotrad;
	 yrotrad = (yrot / 180 * 3.141592654f);
	 xpos -= float(cos(yrotrad)) * 0.2;
	 zpos -= float(sin(yrotrad)) * 0.2;
	 }
switch (key) {
  case 27: //Escape key
   exit(0);
}
}
void mouseMovement(int x, int y) {
	 int diffx=x-lastx;
	 int diffy=y-lasty;
	 lastx=x; //set lastx to the current x position
	 lasty=y; //set lasty to the current y position
	 xrot += (float) diffy /1.2;
	 yrot += (float) diffx /1.2;
}
void camera (void) {
	glRotatef(xrot,1.0,0.0,0.0);
	glRotatef(yrot,0.0,1.0,0.0);
glTranslated(-xpos,-ypos,-zpos);
}
void lighting (void){
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0004f);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos1);
}
//Initializes 3D rendering
void initRendering() {
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING); //Enable lighting
glEnable(GL_LIGHT0);
// images
Image* image = loadBMP("vtr.bmp");
_textureId = loadTexture(image);
delete image;
}
//Called when the window is resized
void handleResize(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 1.0, 2000.0);
}
void drawPlane(){
glPushMatrix();
glTranslatef(0.0f, 0.0f, -20.0f);
glColor3f(0.0f, 1.0f, 1.0f);
/* plane */
glBegin(GL_QUADS);
//glNormal3f(0.0f, 0.0f, 1.0f);
glNormal3f(-1.0f, 0.0f, 1.0f);
  glVertex3f(-5.0f, 0.0f, 0.0f); //bottom-left
glNormal3f(1.0f, 0.0f, 1.0f);
  glVertex3f(-5.0f, 0.0f, -20.0f);//top-left
glNormal3f(1.0f, 0.0f, 1.0f);
  glVertex3f(5.0f, 0.0f, -20.0f);//top-right
glNormal3f(-1.0f, 0.0f, 1.0f);
  glVertex3f(5.0f, 0.0f, 0.0f);//bottom-right
glEnd();
glPopMatrix();
}
void drawBox(){
glPushMatrix();

glTranslatef(0.0f, 0.0f, -20.0f);
glRotatef(_angle, 0.0f, 6.0f, 0.5f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);

//Front
//glNormal3f(0.0f, 0.0f, 1.0f);
glNormal3f(-1.0f, 0.0f, 1.0f);
  glVertex3f(-1.5f, 4.0f, 1.5f);
glNormal3f(1.0f, 0.0f, 1.0f);
  glVertex3f(1.5f, 4.0f, 1.5f);
glNormal3f(1.0f, 0.0f, 1.0f);
  glVertex3f(1.5f, 6.0f, 1.5f);
glNormal3f(-1.0f, 0.0f, 1.0f);
  glVertex3f(-1.5f, 6.0f, 1.5f);

//Right
//glNormal3f(1.0f, 0.0f, 0.0f);
glNormal3f(1.0f, 0.0f, -1.0f);
  glVertex3f(1.5f, 4.0f, -1.5f);
glNormal3f(1.0f, 0.0f, -1.0f);
  glVertex3f(1.5f, 6.0f, -1.5f);
glNormal3f(1.0f, 0.0f, 1.0f);
  glVertex3f(1.5f, 6.0f, 1.5f);
glNormal3f(1.0f, 0.0f, 1.0f);
  glVertex3f(1.5f, 4.0f, 1.5f);

//Back
//glNormal3f(0.0f, 0.0f, -1.0f);
glNormal3f(-1.0f, 0.0f, -1.0f);
  glVertex3f(-1.5f, 4.0f, -1.5f);
glNormal3f(-1.0f, 0.0f, -1.0f);
  glVertex3f(-1.5f, 6.0f, -1.5f);
glNormal3f(1.0f, 0.0f, -1.0f);
  glVertex3f(1.5f, 6.0f, -1.5f);
glNormal3f(1.0f, 0.0f, -1.0f);
  glVertex3f(1.5f, 4.0f, -1.5f);

//Left
//glNormal3f(-1.0f, 0.0f, 0.0f);
glNormal3f(-1.0f, 0.0f, -1.0f);
  glVertex3f(-1.5f, 4.0f, -1.5f);
glNormal3f(-1.0f, 0.0f, 1.0f);
  glVertex3f(-1.5f, 4.0f, 1.5f);
glNormal3f(-1.0f, 0.0f, 1.0f);
  glVertex3f(-1.5f, 6.0f, 1.5f);
glNormal3f(-1.0f, 0.0f, -1.0f);
  glVertex3f(-1.5f, 6.0f, -1.5f);

glEnd();
glPopMatrix();
}
void drawBuilding(){
glPushMatrix();
glBegin(GL_QUADS);
glColor3f(2.0f, 1.0f, 0.0f);
//front - orange
glVertex3f(-60.0f, 0.0f, -60.0f);//bottom-left
glVertex3f(60.0f, 0.0f, -60.0f);//bottom-right
glVertex3f(60.0f, 50.0f, -60.0f);//top-right
glVertex3f(-60.0f, 50.0f, -60.0f);//top-left
glColor3f(0.5f, 1.0f, 0.0f);
//right - green
glVertex3f(60.0f, 0.0f, -60.0f);//bottom-left
glVertex3f(60.0f, 0.0f, 60.0f);//bottom-right
glVertex3f(60.0f, 50.0f, 60.0f);//top-right
glVertex3f(60.0f, 50.0f, -60.0f);//top-left
glColor3f(0.2f, 0.6f, 0.5f);
//back - blue
glVertex3f(60.0f, 0.0f, 60.0f);//bottom left
glVertex3f(-60.0f, 0.0f, 60.0f);//bottom-right
glVertex3f(-60.0f, 50.0f, 60.0f);//top-right
glVertex3f(60.0f, 50.0f, 60.0f);//top-left
glColor3f(0.3f, 0.3f, 0.3f);
//left - gray
glVertex3f(-60.0f, 0.0f, 60.0f);//bottom-left
glVertex3f(-60.0f, 0.0f, -60.0f);//bottom-right
glVertex3f(-60.0f, 50.0f, -60.0f);//top-right
glVertex3f(-60.0f, 50.0f, 60.0f);//top-left
glEnd();
glPopMatrix();
}
void drawFloor(){
float size = 20.0;
float startX = -60.0f;
float startZ = 60.0f;
//glPushMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
for(int x = 0;x < 6; x++){
  for(int z = 0;z < 6; z++){
   glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f);
   glVertex3f(startX + size*x, 0.0f, startZ + -size*z);//bottom-left
	glTexCoord2f(0.0f, 0.0f);
   glVertex3f(startX + size + size*x, 0.0f, startZ + -size*z);//bottom-right
	glTexCoord2f(0.0f, 0.0f);
   glVertex3f(startX + size + size*x, 0.0f, startZ + -size + -size*z);//top-right
	glTexCoord2f(0.0f, 0.0f);
   glVertex3f(startX + size*x, 0.0f, startZ + -size + -size*z);//top-left
   glEnd();
  }
}
glDisable(GL_TEXTURE_2D);
//glPopMatrix();
}
void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//camera();//fixed
//set lighting position
lighting();
//set camera position
camera();//following
/** DRAW **/
drawPlane();
drawBox();
drawBuilding();
drawFloor();
/** END DRAW **/
glutSwapBuffers();
}
void update(int value) {
_angle += 1.5f;
if (_angle > 360) {
  _angle -= 360;
}

glutPostRedisplay();
glutTimerFunc(30, update, 0);
}
int main(int argc, char** argv) {
//Initialize GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);

//Create the window
glutCreateWindow("Lighting");
initRendering();

//Set handler functions
glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
glutPassiveMotionFunc(mouseMovement);
glutTimerFunc(30, update, 0); //Add a timer

glutMainLoop();
return 0;
}


Sponsor:

#2 FXACE   Members   -  Reputation: 182

Like
1Likes
Like

Posted 17 March 2012 - 03:32 PM

You did not used glTexCoord right (this is important!).

Your code:
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);<< check this
glVertex3f(startX + size*x, 0.0f, startZ + -size*z);//bottom-left
glTexCoord2f(0.0f, 0.0f);<<
glVertex3f(startX + size + size*x, 0.0f, startZ + -size*z);//bottom-right
glTexCoord2f(0.0f, 0.0f);<<
glVertex3f(startX + size + size*x, 0.0f, startZ + -size + -size*z);//top-right
glTexCoord2f(0.0f, 0.0f);<<
glVertex3f(startX + size*x, 0.0f, startZ + -size + -size*z);//top-left
glEnd();

I think it should be:

glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(startX + size*x, 0.0f, startZ + -size*z);//bottom-left
glTexCoord2f(1.0f, 0.0f);
glVertex3f(startX + size + size*x, 0.0f, startZ + -size*z);//bottom-right
glTexCoord2f(1.0f, 1.0f);
glVertex3f(startX + size + size*x, 0.0f, startZ + -size + -size*z);//top-right
glTexCoord2f(0.0f, 1.0f);
glVertex3f(startX + size*x, 0.0f, startZ + -size + -size*z);//top-left
glEnd();

edit:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
It would be much better to keep this code into texture initialization function (because you are not changing it to another values in loop),

Best wishes, FXACE.

#3 Shawn619   Members   -  Reputation: 342

Like
0Likes
Like

Posted 17 March 2012 - 11:25 PM

thx solved!




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