OpenGL Textur funktioniert nicht

Hi!

Ich versuche im Moment seit Stunden, in OpenGL meine erste (hart gecodete) Textur zu verwenden. Als Compiler benutze ich „Microsoft Visual C++ 2010 Express“.
Hier ist mein bisheriger, noch nicht funktionierender Code:

[code]
#include
#include
#include
#include

GLuint renderingProgram;
GLuint vertexArrayObject;

double timeOfRun = 0.0;

char *loadShaderFile(char *fileName)
{
    FILE   *shaderSourceFile = fopen(fileName, „r“);
    long    shaderSourceLength;
    GLchar *shaderSource = (GLchar*)malloc(2000);

    for(int i=0; i

Howdy,

die meisten hier sind keine dedizierten OpenGL Programmierer, dafür ist dieses Brett auch eigentlich nicht da. Was mir auffiel ist, dass zumindestens in meiner Version unter Ubuntu die Funktion glTexStorage2D nicht ohne weiteres zur Verfügung steht:

g++ -O2 -lglut -lGL -lGLU -lGLEW main.cpp -o main
main.cpp: In function ‘void init()’:
main.cpp:84:54: error: ‘glTexStorage2D’ was not declared in this scope

Die Includes hab ich aufgrund der vielen Fehlermeldungen auf

#include 
#include 
#include 

#include 
#include 
#include 
#include 

gesetzt. Es fehlt aber immer noch das genannte Symbol, welches sich aber in glext.h befindet, allerdings nur wenn das Symbol GL_GLEXT_PROTOTYPES definiert ist (ein einfaches -DGL_GLEXT_PROTOTYPES beim Compiler reicht hier aber offensichtlich nicht). Vielleicht kann ja auch ein anderer Linux OpenGL Programmierer Licht in diesen Schatten bringen.

Also hab ich den Call vorerst auskommentiert und die Signatur von loadShaderFile auf

char \*loadShaderFile(const char \*fileName)

gesetzt. Danach erhalte ich ein Frame mit einer Hintergrundfarbe und einem schwarzen Dreieck rechs unten. Die Hintergrundfarbe ändert sich ständig, die des Dreieckes nicht.

Ich hab ne Quadro FX 580, an deiner Graphikkarte dürfte es also nicht (alleine) liegen.

Gruss
E.

Hi,

erstmal vielen Dank für deine Antwort, doch ich habe die Lösung mittlerweise selbst gefunden!
Zuerst habe ich den Fragment Shader folgendermaßen geändert.

#version 430 core  
  
uniform sampler2D texture;  
out vec4 color;  
  
void main(void)  
{  
    color = texture(texture, gl\_FragCoord.xy / textureSize(texture, 0));  
}  

Nun verwende ich folgende Funktionen, um die Textur aus der Bitmap-Datei „tex_11_1.bmp“ zu lesen und sie anzuwenden:

void bmpGetSize(FILE \*bmpStream, long \*width, long \*height)  
{  
    fseek(bmpStream, 18, SEEK\_SET);  
    fread(width, sizeof(long), 1, bmpStream);  
    fseek(bmpStream, 22, SEEK\_SET);  
    fread(height, sizeof(long), 1, bmpStream);  
}  
  
void bmpReadTextureFile(FILE \*bmpStream, long bmpSize, GLubyte \*dataPtr)  
{  
    fseek(bmpStream, 54, SEEK\_SET);  
    fread(dataPtr, 1, bmpSize, bmpStream);  
}  
  
void createTexture()  
{  
    FILE    \*textureStream = fopen("tex\_11\_1.bmp", "r");  
    long     textureWidth, textureHeight;  
    GLuint   textureBuffer;  
    GLint    textureLoc;  
    GLint    textureCoordLoc;  
    GLubyte \*textureData;  
    bmpGetSize(textureStream, &textureWidth, &textureHeight);  
    textureData = (GLubyte\*)malloc(textureWidth\*textureHeight\*3);  
    bmpReadTextureFile(textureStream, textureWidth\*textureHeight\*3, textureData);  
    fclose(textureStream);  
  
    glEnable(GL\_TEXTURE\_2D);  
  
    glGenTextures(1, &textureBuffer);  
    glBindTexture(GL\_TEXTURE\_2D, textureBuffer);  
    glTexImage2D(GL\_TEXTURE\_2D, 0, GL\_RGB, textureWidth-1, textureHeight-1, 0, GL\_BGR, GL\_UNSIGNED\_BYTE, textureData);  
  
    glTexParameterf(GL\_TEXTURE\_2D, GL\_TEXTURE\_WRAP\_S, GL\_REPEAT);  
    glTexParameterf(GL\_TEXTURE\_2D, GL\_TEXTURE\_WRAP\_T, GL\_REPEAT);  
    glTexParameterf(GL\_TEXTURE\_2D, GL\_TEXTURE\_MAG\_FILTER, GL\_NEAREST);  
    glTexParameterf(GL\_TEXTURE\_2D, GL\_TEXTURE\_MIN\_FILTER, GL\_NEAREST);  
  
    textureCoordLoc = glGetAttribLocation(renderingProgram, "texCoord");  
    glEnableVertexAttribArray(textureCoordLoc);  
    glVertexAttribPointer(textureCoordLoc, 2, GL\_FLOAT, GL\_FALSE, 0, NULL);  
    textureLoc = glGetUniformLocation(renderingProgram, "texture");  
    glActiveTexture(GL\_TEXTURE0);  
    glUniform1i(textureLoc, 0);  
}  
  
void init()  
{  
    renderingProgram = compileShaders();  
    glUseProgram(renderingProgram);  
    createTexture();  
  
    glGenVertexArrays(1, &vertexArrayObject);  
    glBindVertexArray(vertexArrayObject);  
}  

Jetzt wird die Textur einfach so oft auf das Objekt gelegt, bis es augefüllt ist. In der Funktion „glTexImage2D()“ habe ich übrigens die Breite und die Höhe jeweils um 1 verringert, da sonst um die Texturen schwarze Rahmen erscheinen.

Gruß,
nano99