2010-06-06 9 views
6

पर लागू किया गया है, मैं ओपनजीएल के लिए थोड़ा नया हूं और मुझे बनावट का उपयोग करने में समस्या है। बनावट ठीक लगती है, लेकिन जब मैं प्रोग्राम चलाता हूं, तो बनावट के डिस्प्ले बाईं ओर एक पिक्सेल को स्थानांतरित कर देते हैं, जिसमें सेक्शन को दाईं ओर दिखाई देने वाली शिफ्ट से काट दिया जाता है। मुझे नहीं पता कि यहां मेरी समस्या मेरे टीजीए लोडर में है या अगर मैं क्वाड पर बनावट लागू कर रहा हूं। यहाँओपनजीएल बनावट को कुछ हद तक बाईं ओर स्थानांतरित किया गया जब एक क्वाड

#include "texture.h" 
#include <iostream> 

GLubyte uncompressedheader[12] = {0,0, 2,0,0,0,0,0,0,0,0,0}; 
GLubyte compressedheader[12] = {0,0,10,0,0,0,0,0,0,0,0,0}; 


TGA::TGA() 
{ 

} 

//Private loading function called by LoadTGA. Loads uncompressed TGA files 
//Returns: TRUE on success, FALSE on failure 
bool TGA::LoadCompressedTGA(char *filename,ifstream &texturestream) 
{ 
return false; 
} 

bool TGA::LoadUncompressedTGA(char *filename,ifstream &texturestream) 
{ 
cout << "G position status:" << texturestream.tellg() << endl; 
texturestream.read((char*)header, sizeof(header));  //read 6 bytes into the file to get the tga header 
width = (GLuint)header[1] * 256 + (GLuint)header[0]; //read and calculate width and save 
height = (GLuint)header[3] * 256 + (GLuint)header[2]; //read and calculate height and save 
bpp = (GLuint)header[4];   //read bpp and save 

cout << bpp << endl; 

if((width <= 0) || (height <= 0) || ((bpp != 24) && (bpp !=32))) //check to make sure the height, width, and bpp are valid 
{ 
    return false; 
} 
if(bpp == 24)   
{ 
    type = GL_RGB; 
} 
else 
{ 
    type = GL_RGBA; 
} 
imagesize = ((bpp/8) * width * height);   //determine size in bytes of the image 
cout << imagesize << endl; 
imagedata = new GLubyte[imagesize];   //allocate memory for our imagedata variable 

texturestream.read((char*)imagedata,imagesize);  //read according the the size of the image and save into imagedata 

for(GLuint cswap = 0; cswap < (GLuint)imagesize; cswap += (bpp/8))   //loop through and reverse the tga's BGR format to RGB 
{ 
    imagedata[cswap] ^= imagedata[cswap+2] ^=     //1st Byte XOR 3rd Byte XOR 1st Byte XOR 3rd Byte 
    imagedata[cswap] ^= imagedata[cswap+2]; 
} 

texturestream.close();    //close ifstream because we're done with it 
cout << "image loaded" << endl; 

glGenTextures(1, &texID);    // Generate OpenGL texture IDs 
glBindTexture(GL_TEXTURE_2D, texID);   // Bind Our Texture 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Filtered 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, type, width, height, 0, type, GL_UNSIGNED_BYTE, imagedata); 



    delete imagedata; 
return true; 
} 

//Public loading function for TGA images. Opens TGA file and determines 
//its type, if any, then loads it and calls the appropriate function. 
//Returns: TRUE on success, FALSE on failure 

bool TGA::loadTGA(char *filename) 
{ 
cout << width << endl; 
ifstream texturestream; 
texturestream.open(filename,ios::binary); 
texturestream.read((char*)header,sizeof(header));  //read 6 bytes into the file, its the header.    //if it matches the uncompressed header's first 6 bytes, load it as uncompressed 
LoadUncompressedTGA(filename,texturestream); 
return true; 
} 

GLubyte* TGA::getImageData() 
{ 
return imagedata; 
} 

GLuint& TGA::getTexID() 
{ 
return texID; 
} 

और ट्रैक्टर है::

यहाँ लोडर है

void Square::show() 
{  

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture.texID); 


    //Move to offset 
    glTranslatef(x, y, 0); 

//Start quad 
    glBegin(GL_QUADS); 

//Set color to white 
glColor4f(1.0, 1.0, 1.0, 1.0); 

//Draw square 
glTexCoord2f(0.0f, 0.0f); glVertex3f(0,   0,    0); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(SQUARE_WIDTH, 0,    0); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(SQUARE_WIDTH, SQUARE_HEIGHT, 0); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0,   SQUARE_HEIGHT, 0); 

    //End quad 
    glEnd(); 

    //Reset 
glLoadIdentity(); 
} 
+0

एक स्क्रीनशॉट जोड़ने कृपया – Bahbar

उत्तर

2

एक स्क्रीनशॉट बहुत मददगार होगा।
मेरा पहला अनुमान यह है कि आपकी पंक्तियां 4 बाइट गठबंधन नहीं हैं। यदि ऐसा है, gltexImage2D() को कॉल करने से पहले glPixelStorei(GL_UNPACK_ALIGNMENT, 1); के साथ अनपैक संरेखण को 1 बाइट में बदलें।

3

आप बनावट पैरामीटर सेट करना चाहते हैं ताकि बनावट क्वाड को फिट करने के लिए स्केल हो। आप कोड की निम्नलिखित पंक्तियों के साथ ऐसा करते हैं:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

इन्हें क्वाड फिट करने के लिए रैखिक रूप से ऊपर या नीचे बनावट होगी।

आप शायद भी निम्न कॉल के साथ बनावट क्लैंप चाहिए:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
संबंधित मुद्दे