2011-07-15 242 views
0

我試圖使用創建紋理並存儲它的ID和大小(感謝ADC和另一個stackoverflow成員)的模型類來渲染2紋理的非冪次,以及創建VBO的附加代碼並渲染它(VBO和渲染的代碼僅用於測試目的,它在我的模型中被正確劃分)。OpenGL紋理初始化/渲染問題

當我使用此代碼,但刪除紋理特定的代碼時,它工作正常。但是,當添加特定於紋理的代碼時,它只會渲染我認爲是右下像素的圖像,從嘗試多個複雜圖像並使用DigitalColor Meter檢查圖像和輸出。

我不認爲使用此設置時必須明確指定紋理座標,如果他們這樣做,我會怎麼樣?

主要的OpenGL代碼

// Create vertex buffer 
    GLuint memoryPointer = 0; 
    GLuint colourMemoryPointer = 0; 

    GLfloat *vertices; 
    size_t vertex_size = 0; 

    int check = AllocateVertexBuffer(2, 4, &vertices, &vertex_size); 
    CDMeshVertexesCreateRectangle(200, 200, vertices); 


    // Create colour buffer 
    GLfloat *colors; 
    size_t color_size; 

    int check2 = AllocateVertexBuffer(4, 4, &colors, &color_size); 
    CDMeshColorsCreateGrey(1.0, 4, colors); 


    // Create texture buffer 
    CDTexture *texture = [CDTexture loadPngTexture:@"Rawr"]; 

    // Allocate the buffer 
    glGenBuffers(1, &memoryPointer); 
    // Bind the buffer object (tell OpenGL what to use) 
    glBindBuffer(GL_ARRAY_BUFFER, memoryPointer); 

    // Allocate space for the VBO 
    glBufferData(GL_ARRAY_BUFFER, vertex_size, vertices, GL_STATIC_DRAW); 


    // Allocate the buffer 
    glGenBuffers(1, &colourMemoryPointer); 
    // Bind the buffer object (tell OpenGL what to use) 
    glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 

    // Allocate space for the VBO 
    glBufferData(GL_ARRAY_BUFFER, color_size, colors, GL_STATIC_DRAW); 

    glEnableClientState(GL_VERTEX_ARRAY); // Activate vertex coordinates array 
    glEnableClientState(GL_COLOR_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, memoryPointer); 
    glVertexPointer(2, GL_FLOAT, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 
    glColorPointer(4, GL_FLOAT, 0, 0); 

    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture.ID); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0); 

    //[texture render]; 

    //render 
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

    glDisableClientState(GL_VERTEX_ARRAY); // Deactivate vertex coordinates array 
    glDisableClientState(GL_COLOR_ARRAY); 

    free(vertices); 
    free(colors); 

CDTexture loadPngTexture:方法

CFURLRef textureURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), 
               (CFStringRef)fileName, 
               CFSTR("png"), 
               NULL); 

NSAssert(textureURL, @"Texture name invalid"); 

// Get the image source using a file path 
CGImageSourceRef myImageSourceRef = CGImageSourceCreateWithURL(textureURL, NULL); 
NSAssert(myImageSourceRef, @"Invalid Image Path."); 
NSAssert((CGImageSourceGetCount(myImageSourceRef) > 0), @"No Image in Image Source."); 

// Get the image reference using the source reference, -_- 
CGImageRef myImageRef = CGImageSourceCreateImageAtIndex (myImageSourceRef, 0, NULL); 
NSAssert(myImageSourceRef, @"Image not created."); 

// Start gathering data from the image, before releasing it 
GLuint myTextureName; 
size_t width = CGImageGetWidth(myImageRef); 
size_t height = CGImageGetHeight(myImageRef); 
CGRect rect = {{0, 0}, {width, height}}; 
void * myData = calloc(width * 4, height); 
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 
CGContextRef myBitmapContext = CGBitmapContextCreate (myData, 
                 width, height, 8, 
                 width*4, space, 
                 kCGBitmapByteOrder32Host | 
                 kCGImageAlphaPremultipliedFirst); 

CGColorSpaceRelease(space); 
// Flip so that it isn't upside-down 
CGContextTranslateCTM(myBitmapContext, 0, height); 
CGContextScaleCTM(myBitmapContext, 1.0f, -1.0f); 
CGContextSetBlendMode(myBitmapContext, kCGBlendModeCopy); 
CGContextDrawImage(myBitmapContext, rect, myImageRef); 
CGContextRelease(myBitmapContext); 

glEnable(GL_TEXTURE_RECTANGLE_ARB); 

// Generate texture buffer 
glGenTextures(1, &myTextureName); 

// Bind buffer for use 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName); 

// Set storage methods 
glPixelStorei(GL_UNPACK_ROW_LENGTH, width); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

// Set the parameter required for non power of two textures 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, 
       GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

// Load the texture data into the buffer 
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, width, height, 
      0, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, myData); 

// Free the data used, as it's now in the buffer 
free(myData); 

// Return information on texture object 
CDTexture *texture = [[CDTexture alloc] init]; 

texture.ID = myTextureName; 
texture.size = NSMakeSize(width, height); 

return texture; 

UPDATE
我使用一個紋理指針定義區域嘗試,而這導致了同樣的問題。即使沒有綁定和使用指針,它繪製的顏色/紋理也會這樣做。我也曾嘗試在使用和渲染之前和之後啓用和禁用GL_TEXTURE_COORD_ARRAY,並導致相同的問題。

除非我做錯了什麼,這個問題似乎與紋理指針沒有關係。

GLfloat texCoords[8] = { 
0.0, 0.0, 
0.0, 1.0, 
1.0, 1.0, 
1.0, 0.0 
}; 

... 

glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 
glColorPointer(4, GL_FLOAT, 0, 0); 

glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture.ID); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 

//[texture render]; 

//render 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

更新2
我試圖獲得來自OpenGL的錯誤代碼,試圖解決這個問題,但沒有錯誤代碼已被打印出來。

UPDATE 3
我已使用不同的方法來獲得原始圖像數據試過,和相同的結果發生(儘管有一些變色,因爲我不能使用正確的顏色設置)。 OpenGL對這些數據的解釋在這裏必須是有缺陷的。我已經嘗試過使用glPixelStorei(),但到目前爲止沒有任何改變。由於OpenGL沒有報告任何錯誤,它必須與數據的程序解釋一致,所以無論是我爲存儲數據的方式設置的參數,還是隻導致1像素顯示的頂點問題,雖然由於這個原因精度,它很可能是參數。

原始圖像數據的新過程(感謝另一個stackoverflow用戶)。發佈供參考。

NSBitmapImageRep *theImage; 
int bitsPPixel, bytesPRow; 
NSSize size; 
unsigned char *theImageData; 

NSData* imgData = [NSData dataWithContentsOfFile:fileName options:NSUncachedRead error:nil]; // use FileURL 

theImage = [NSBitmapImageRep imageRepWithData:imgData]; 


if(theImage != nil) 
{ 
    bitsPPixel = [theImage bitsPerPixel]; 
    bytesPRow = [theImage bytesPerRow]; 
    size.width = [theImage pixelsWide]; 
    size.height = [theImage pixelsHigh]; 
} 

enter code here 

UPDATE 4
更改爲GL_TEXTURE_2D效率。左下角的像素仍然只能被渲染。這裏是代碼的完整的訂單:

// Create vertex buffer 
    GLuint memoryPointer = 0; 
    GLuint colourMemoryPointer = 0; 

    GLfloat *vertices; 
    size_t vertex_size = 0; 

    AllocateVertexBuffer(2, 4, &vertices, &vertex_size); 
    CDMeshVertexesCreateRectangle(200, 200, vertices); 


    // Create colour buffer 
    GLfloat *colors; 
    size_t color_size; 

    AllocateVertexBuffer(4, 4, &colors, &color_size); 
    CDMeshColorsCreateGrey(1.0, 4, colors); 

    // Create Texture UV Coordinates 
    GLfloat *texture; 
    size_t texture_size; 
    AllocateVertexBuffer(4, 2, &texture, &texture_size); 
    CDMeshVertexesCreateRectangle(1, 1, texture); 

    // Create texture buffer 
    NSString *fileName = @"Rawr3"; 

    CFURLRef textureURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), 
                (CFStringRef)fileName, 
                CFSTR("png"), 
                NULL); 

    NSAssert(textureURL, @"Texture name invalid"); 

    // Get the image source using a file path 
    CGImageSourceRef myImageSourceRef = CGImageSourceCreateWithURL(textureURL, NULL); 
    NSAssert(myImageSourceRef, @"Invalid Image Path."); 
    NSAssert((CGImageSourceGetCount(myImageSourceRef) > 0), @"No Image in Image Source."); 

    // Get the image reference using the source reference, -_- 
    CGImageRef myImageRef = CGImageSourceCreateImageAtIndex (myImageSourceRef, 0, NULL); 
    NSAssert(myImageSourceRef, @"Image not created."); 

    // Start gathering data from the image, before releasing it 
    GLuint myTextureName; 
    size_t width = CGImageGetWidth(myImageRef); 
    size_t height = CGImageGetHeight(myImageRef); 
    CGRect rect = {{0, 0}, {width, height}}; //Doesnt need fiddling 
    void * myData = calloc(width * 4, height); //Fiddled 
    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef myBitmapContext = CGBitmapContextCreate (myData, 
                  width, height, 8, 
                  width*4, space, 
                  kCGBitmapByteOrder32Host | 
                  kCGImageAlphaPremultipliedFirst); 

    CGColorSpaceRelease(space); 
    // Flip so that it isn't upside-down 
    CGContextTranslateCTM(myBitmapContext, 0, height); 
    CGContextScaleCTM(myBitmapContext, 1.0f, -1.0f); 
    CGContextSetBlendMode(myBitmapContext, kCGBlendModeCopy); 
    CGContextDrawImage(myBitmapContext, rect, myImageRef); 
    CGContextRelease(myBitmapContext); 

    // Generate texture buffer 
    glGenTextures(1, &myTextureName); 

    // Bind buffer for use 
    glBindTexture(GL_TEXTURE_2D, myTextureName); 

    // Set storage methods 
    glTexParameteri(GL_TEXTURE_2D, 
        GL_TEXTURE_STORAGE_HINT_APPLE, 
        GL_STORAGE_CACHED_APPLE); 

    glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); 

    // Set clamping and rendering preferences 
    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_MAG_FILTER, 
        GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
        GL_NEAREST); 

    // Load the texture data into the buffer 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 
       0, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, myData); 

    glGetError(); 

    // Free the data used, as it's now in the buffer 
    free(myData); 

    // Return information on texture object 
    CDTexture *textureObj = [[CDTexture alloc] init]; 

    textureObj.ID = myTextureName; 
    textureObj.size = NSMakeSize(width, height); 

    // Allocate the buffer 
    glGenBuffers(1, &memoryPointer); 
    // Bind the buffer object (tell OpenGL what to use) 
    glBindBuffer(GL_ARRAY_BUFFER, memoryPointer); 

    // Allocate space for the VBO 
    glBufferData(GL_ARRAY_BUFFER, vertex_size, vertices, GL_STATIC_DRAW); 


    // Allocate the buffer 
    glGenBuffers(1, &colourMemoryPointer); 
    // Bind the buffer object (tell OpenGL what to use) 
    glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 

    // Allocate space for the VBO 
    glBufferData(GL_ARRAY_BUFFER, color_size, colors, GL_STATIC_DRAW); 

    glEnableClientState(GL_VERTEX_ARRAY); // Activate vertex coordinates array 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnable(GL_TEXTURE_2D); 

    glBindBuffer(GL_ARRAY_BUFFER, memoryPointer); 
    glVertexPointer(2, GL_FLOAT, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 
    glColorPointer(4, GL_FLOAT, 0, 0); 

    glBindTexture(GL_TEXTURE_2D, textureObj.ID); 
    glTexCoordPointer(2, GL_FLOAT, 0, texture); 

    GetGLError(); 

    //render 
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

    glDisableClientState(GL_VERTEX_ARRAY); // Deactivate vertex coordinates array 
    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisable(GL_TEXTURE_2D); 

    glDeleteBuffers(1, &memoryPointer); 
    glDeleteBuffers(1, &colourMemoryPointer); 
    GLuint texID = textureObj.ID; 
    glDeleteBuffers(1, &texID); 

    free(vertices); 
    free(colors); 
    free(texture); 


} 

UPDATE 5 從glTexImage2D(),它會使紋理的左下像素,即使我不綁定紋理,並添加座標它,這似乎很奇怪,考慮到它應該使用glTexCoordPointer()繪製。

UPDATE 6 可能是最後更新,所使用的紋理初始化代碼與另一更大,「手動」繪圖技術和它工作得很好。我已經刪除了Apple特定的元素。從該代碼中刪除顏色VBO和指針時,由於某種奇怪的原因,白色框仍然呈現。問題是與VBO的,但我不明白爲什麼。 GL_TEXTURE_RECTANGLE_ARB現在僅用於我的彩色紋理,將在解決此問題時更改。

// Create vertex buffer 
    GLuint memoryPointer = 0; 
    GLuint colourMemoryPointer = 0; 

    GLfloat *vertices; 
    size_t vertex_size = 0; 

    AllocateVertexBuffer(2, 4, &vertices, &vertex_size); 
    CDMeshVertexesCreateRectangle(200, 200, vertices); 

    GetGLError(); 

    // Create colour buffer 
    GLfloat *colors; 
    size_t color_size; 

    AllocateVertexBuffer(4, 4, &colors, &color_size); 
    CDMeshColorsCreateGrey(0.4, 4, colors); 

    // Allocate the buffer 
    glGenBuffers(1, &memoryPointer); 
    glBindBuffer(GL_ARRAY_BUFFER, memoryPointer); 
    glBufferData(GL_ARRAY_BUFFER, vertex_size, vertices, GL_STATIC_DRAW); 

    // Allocate the buffer 
    glGenBuffers(1, &colourMemoryPointer); 
    glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 
    glBufferData(GL_ARRAY_BUFFER, color_size, colors, GL_STATIC_DRAW); 

    // Enable client states for drawing the various arrays 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    // Bind each buffer and use the VBO's to draw (apart from the texture buffer) 
    glBindBuffer(GL_ARRAY_BUFFER, memoryPointer); 
    glVertexPointer(2, GL_FLOAT, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 
    glColorPointer(4, GL_FLOAT, 0, 0); 

    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName); // 
    glTexCoordPointer(2, GL_FLOAT, 0, texture); 

    //render 
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

    // Disale client states as were done with them. 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisable(GL_TEXTURE_RECTANGLE_ARB); 

    GetGLError(); 

    // Delete buffers to avoid problems 
    glDeleteBuffers(1, &memoryPointer); 
    glDeleteBuffers(1, &colourMemoryPointer); 
    glDeleteBuffers(1, &myTextureName); 

    free(vertices); 
    free(colors); 
    free(texture); 
+1

提示:不要使用GL_TEXTURE_RECTANGLE_ARB,它不適用於所有gfx卡片及其超級流氓軟件,並且不支持mipmapping無論是。總是使用GL_TEXTURE_2D! – Rookie

+0

@Rookie,謝謝你的提示,我已經嘗試過使用這個功能的兩個圖像和UV座標集,它現在根本不輸出圖像。雖然會繼續使用GL_TEXTURE_2D。 – Croc

回答

0

我通過爲紋理創建一個頂點緩衝區對象(VBO)解決了這個問題(最後),而不是直接向glTextureCoordPointer()提供頂點數據。我想這裏的教訓是,如果你要使用VBO的話,把它們用於一切!作爲參考,在這裏是完整的代碼:

紋理製作

// Create texture buffer, start with the name of the image. 
    NSString *fileName = @"Rawr"; 

    CFURLRef textureURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), 
                (CFStringRef)fileName, 
                CFSTR("png"), 
                NULL); 

    NSAssert(textureURL, @"Texture name invalid"); 

    // Get the image source using a file path 
    CGImageSourceRef myImageSourceRef = CGImageSourceCreateWithURL(textureURL, NULL); 
    NSAssert(myImageSourceRef, @"Invalid Image Path."); 
    NSAssert((CGImageSourceGetCount(myImageSourceRef) > 0), @"No Image in Image Source."); 

    // Get the image reference using the source reference, -_- 
    CGImageRef myImageRef = CGImageSourceCreateImageAtIndex (myImageSourceRef, 0, NULL); 
    NSAssert(myImageSourceRef, @"Image not created."); 

    // Start gathering data from the image, before releasing it 
    GLuint myTextureName; 
    size_t width = CGImageGetWidth(myImageRef); 
    size_t height = CGImageGetHeight(myImageRef); 
    CGRect rect = {{0, 0}, {width, height}}; //Doesnt need fiddling 
    void * myData = calloc(width * 4, height); //Fiddled 
    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef myBitmapContext = CGBitmapContextCreate (myData, 
                  width, height, 8, 
                  width*4, space, 
                  kCGBitmapByteOrder32Host | 
                  kCGImageAlphaPremultipliedFirst); 

    CGColorSpaceRelease(space); 
    // Flip so that it isn't upside-down 
    CGContextTranslateCTM(myBitmapContext, 0, height); 
    CGContextScaleCTM(myBitmapContext, 1.0f, -1.0f); 
    CGContextSetBlendMode(myBitmapContext, kCGBlendModeCopy); 
    CGContextDrawImage(myBitmapContext, rect, myImageRef); 
    CGContextRelease(myBitmapContext); 

    GetGLError(); 

    // The extension GL_TEXTURE_RECTANGLE_ARB can be used for non-power of two textures, but it is slower than GL_TEXTURE_2D and not 
    // supported by all graphics cards. 
    glEnable(GL_TEXTURE_RECTANGLE_ARB); 
    glGenTextures(1, &myTextureName); 
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName); 
    glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, myData); 
    //glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT ,GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB,myTextureName, 0); 
    free(myData); 

VBO創作

// Create vertex buffer 
    GLuint memoryPointer = 0; 
    GLuint colourMemoryPointer = 0; 
    GLuint texPointer = 0; 

    GLfloat *vertices; 
    size_t vertex_size = 0; 

    AllocateVertexBuffer(2, 4, &vertices, &vertex_size); 
    CDMeshVertexesCreateRectangle(200, 200, vertices); 

    GetGLError(); 

    // Create colour buffer 
    GLfloat *colors; 
    size_t color_size; 

    AllocateVertexBuffer(4, 4, &colors, &color_size); 
    CDMeshColorsCreateGrey(0.0, 4, colors); 

    // Create Texture UV Coordinates 
    GLfloat *texture; 
    size_t texture_size; 
    AllocateVertexBuffer(2, 4, &texture, &texture_size); 
    CDMeshVertexesCreateRectangle(200, 200, texture); 

    // Allocate the vertex VBO 
    glGenBuffers(1, &memoryPointer); 
    glBindBuffer(GL_ARRAY_BUFFER, memoryPointer); 
    glBufferData(GL_ARRAY_BUFFER, vertex_size, vertices, GL_STATIC_DRAW); 

    // Allocate the colour VBO 
    glGenBuffers(1, &colourMemoryPointer); 
    glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 
    glBufferData(GL_ARRAY_BUFFER, color_size, colors, GL_STATIC_DRAW); 

    // Allocate the texture VBO 
    glGenBuffers(1, &texPointer); 
    glBindBuffer(GL_ARRAY_BUFFER, texPointer); 
    glBufferData(GL_ARRAY_BUFFER, texture_size, texture, GL_STATIC_DRAW); 

渲染和刪除VBO及數據

// Enable client states for drawing the various arrays 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    // Bind each buffer and use the VBO's to draw 
    glBindBuffer(GL_ARRAY_BUFFER, memoryPointer); 
    glVertexPointer(2, GL_FLOAT, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, colourMemoryPointer); 
    glColorPointer(4, GL_FLOAT, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, texPointer); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0); 
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName); 

    // RENDER! 
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

    // Disale client states as were done with them. 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisable(GL_TEXTURE_RECTANGLE_ARB); 

    GetGLError(); 

    // Delete buffers when they arent being used. 
    glDeleteBuffers(1, &memoryPointer); 
    glDeleteBuffers(1, &colourMemoryPointer); 
    glDeleteBuffers(1, &myTextureName); 
    glGenTextures(GL_TEXTURE_RECTANGLE_ARB, 0); 

    // Free vertexes when done using them 
    free(vertices); 
    free(colors); 
    free(texture); 
1

當然,您必須提供紋理座標。作爲頂點屬性矢量的一部分,或者通過生成它們(在着色器中)。但是你必須以某種方式提供紋理座標,你無法解決這個問題。

+1

@Croc,閱讀我的提示,同時GL_TEXTURE_RECTANGLE_ARB以像素爲單位採用texcoords,而不是0-1值。只需將GL_TEXTURE_RECTANGLE_ARB更改爲GL_TEXTURE_2D即可 – Rookie