Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » OpenGL Textur funktioniert nicht » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen OpenGL Textur funktioniert nicht
Beiträge zu diesem Thema Autor Datum
 OpenGL Textur funktioniert nicht nano 99 15.01.2014 17:17

Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
nano 99
unregistriert
OpenGL Textur funktioniert nicht Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

nano 99 hat dieses Bild (verkleinerte Version) angehängt:
Screenshot.png

15.01.2014 17:17
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » OpenGL Textur funktioniert nicht