OpenGL Textur funktioniert nicht

Neue Frage »

Auf diesen Beitrag antworten »
nano 99 OpenGL Textur funktioniert nicht

Meine Frage:
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".

Meine Ideen:
Hier ist mein bisheriger, noch nicht funktionierender Code:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
#include <gl/glew.h>
#include <gl/freeglut.h>
#include <stdio.h>
#include <math.h>

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<2000; i++)
        *(shaderSource+i) = '\0';

    if(shaderSourceFile == NULL) exit(EXIT_FAILURE);

    fseek(shaderSourceFile, 0, SEEK_END);
    shaderSourceLength = ftell(shaderSourceFile);
    rewind(shaderSourceFile);
    fread((GLchar*)shaderSource, shaderSourceLength, sizeof(char), shaderSourceFile);
    fclose(shaderSourceFile);

    return shaderSource;
}

GLuint compileShaders()
{
    const GLchar  *vertexShaderSource;
    const GLchar  *fragmentShaderSource;
          GLuint   vertexShader;
          GLuint   fragmentShader;
          GLuint   program;

    vertexShaderSource = loadShaderFile("openglSuperTutorials11.vss");
    fragmentShaderSource = loadShaderFile("openglSuperTutorials11.fss");

    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);

    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);

    program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glLinkProgram(program);

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    return program;
}

void init()
{
    GLuint textureBuffer;
    GLfloat textureData[] =
    {
        1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,
        1.0, 0.0, 0.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   1.0, 0.0, 0.0, 1.0,
        1.0, 0.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   0.0, 0.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   0.0, 0.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,
        1.0, 0.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 0.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,
        1.0, 0.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 0.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   0.0, 0.0, 0.0, 1.0,   0.0, 1.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,
        1.0, 0.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   0.0, 0.0, 0.0, 1.0,   0.0, 0.0, 0.0, 1.0,   0.0, 0.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   1.0, 1.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,
        1.0, 0.0, 0.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   0.0, 0.0, 1.0, 1.0,   1.0, 0.0, 0.0, 1.0,
        1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0,   1.0, 0.0, 0.0, 1.0
    };

    glGenTextures(1, &textureBuffer);
    glBindTexture(GL_TEXTURE_2D, textureBuffer);
    glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 9, 8);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 9, 8, GL_RGBA, GL_FLOAT, textureData);

    glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    renderingProgram = compileShaders();

    glGenVertexArrays(1, &vertexArrayObject);
    glBindVertexArray(vertexArrayObject);
}

void display(void)
{
    GLuint positionBuffer;
    GLfloat positionData[] =
    {
         0.75, -0.75, 0.5, 1.0,
        -0.75, -0.75, 0.5, 1.0,
         0.75,  0.75, 0.5, 1.0
    };

    GLfloat bgColor[] = { sin(timeOfRun)*0.5+0.5, 0.0, cos(timeOfRun)*0.5+0.5, 1.0 };
    glClearBufferfv(GL_COLOR, 0, bgColor);

    glUseProgram(renderingProgram);

    glGenBuffers(1, &positionBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(positionData), positionData, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    glEnableVertexAttribArray(0);

    glDrawArrays(GL_TRIANGLES, 0, 6);

    glFlush();
}

void idle(void)
{
    timeOfRun+=0.02;
    Sleep(20);
    display();
}

void reshape(int w, int h)
{
    idle();
    display();
}

void close(void)
{
    glDeleteVertexArrays(1, &vertexArrayObject);
    glDeleteProgram(renderingProgram);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(500, 500);
    glutCreateWindow("openglSuperTutorials11 - Erstes Dreieck mit Textur");

    if(glewInit()) exit(EXIT_FAILURE);

    init();
    
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);
    glutCloseFunc(close);
    glutMainLoop();

    return EXIT_SUCCESS;
}


Die Inhalte der beiden Shader-Dateien sind folgendermaßen:
Der Vertex Shader:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
#version 430 core

layout (location = 0) in vec4 position;

void main(void)
{
    gl_Position = position;
}

und der Fragment Shader:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
#version 430 core

uniform sampler2D s;
out vec4 color;

void main(void)
{
    color = texture(s, gl_FragCoord.xy / textureSize(s, 0));
}


Mein Programm zeigt mir jetzt aber kein Dreieck mit Textur, sondern nur ein schwarzes Dreieck (siehe Anhang). Könnte es vielleicht an meiner Grafikkarte liegen?

Über sie werden folgende Informationen ausgegeben:
code:
1:
2:
3:
4:
5:
6:
Version:      4.0.0 - Build 10.18.10.3316
Renderer:     Intel(R) HD Graphics 4000
Vendor:       Intel
GLSL Version: 4.00 - Build 10.18.10.3316


Auch wenn ich mir die Shader Infos/Program Infos mit folgendem Code ausgebe, bekomme ich nur leere Dateien:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
void printLog(GLuint input, int shaderOrProgram, char *fileName)
{
    GLint   logLength;
    GLchar *log;
    FILE   *logFile = fopen(fileName, "w");
    if(shaderOrProgram == 0)
        glGetShaderiv(input, GL_INFO_LOG_LENGTH, &logLength);
    else
        glGetProgramiv(input, GL_INFO_LOG_LENGTH, &logLength);
    log = (GLchar*)malloc(logLength);
    if(shaderOrProgram == 0)
        glGetShaderInfoLog(input, logLength, NULL, log);
    else
        glGetProgramInfoLog(input, logLength, NULL, log);
    fprintf(logFile, "%s", log);
    fclose(logFile);
}
/*
Parameter:
(Vertex Shader): printLog(vertexShader, 0, "vsLog.txt");
(Fragment Shader): printLog(fragmentShader, 0, "fsLog.txt");
(Program): printLog(program, 1, "progLog.txt");
*/


Was mache ich an meinem Code noch falsch? Oder, wenn meine Grafikkarte zu alt ist, welche OpenGL/GLSL Version müsste sie dann mindestens unterstützen?

Über eine hilfreiche Antwort wäre ich sehr dankbar.

Gruß,
nano99
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »