Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

01.07.2008, 20:21

Was stimmt da an meinem GLSL Beispiel nicht?

Hi Leute,

ich will jetzt unbedingt mal was mit OpenGL Shader (GLSL / glSlang) ausprobieren und hab auch schon ein kleines bischen was hinbekommen.
Oder besser gesagt: ich hab was zum laufen gebracht aber man sieht von Shadern weit und breit nichts :lol:

Ich hab hier den Ausschnitt wo ich die glSlang Funktionen habe und würde gerne wissen was daran falsch ist.
Vorab: Ich rufe diesen Codeabschnitt im ganzen Programm nur ein einziges mal auf und dann nicht mehr, mit keiner dieser Funktionen:

C-/C++-Quelltext

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
/**** GL SLANG *****/

PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = NULL;
PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL;
PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL;
PFNGLDETACHOBJECTARBPROC glDetachObjectARB = NULL;

GLhandleARB ProgramObject, VertexShaderObject, FragmentShaderObject;

glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress("glCreateProgramObjectARB");
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress("glCreateShaderObjectARB");
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress("glShaderSourceARB");
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress("glCompileShaderARB");
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress("glAttachObjectARB");
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)wglGetProcAddress("glDeleteObjectARB");
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress("glLinkProgramARB");
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress("glUseProgramObjectARB");
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB");
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress("glGetInfoLogARB");
glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)wglGetProcAddress("glDetachObjectARB");

if (glCreateProgramObjectARB == NULL) MessageBeep(16);
if (glCreateShaderObjectARB == NULL) MessageBeep(16);
if (glShaderSourceARB == NULL) MessageBeep(16);
if (glCompileShaderARB == NULL) MessageBeep(16);
if (glAttachObjectARB == NULL) MessageBeep(16);
if (glDeleteObjectARB == NULL) MessageBeep(16);
if (glLinkProgramARB == NULL) MessageBeep(16);
if (glUseProgramObjectARB == NULL) MessageBeep(16);
if (glGetObjectParameterivARB == NULL) MessageBeep(16);
if (glGetInfoLogARB == NULL) MessageBeep(16);
if (glDetachObjectARB == NULL) MessageBeep(16);

ProgramObject = glCreateProgramObjectARB();
VertexShaderObject = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
FragmentShaderObject = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);

//GLuint ShaderTextVertLines = 3, ShaderTextFragLines = 3;

//const char* ShaderTextVert[] = { "", "", "" };

//const char* ShaderTextFrag[] = { "", "", "" };


// ======= Read vertex shader =======


int lines1 = 0, lines2;
const int MAX_LENGTH = 100;
char line[MAX_LENGTH];

vector<string> Context1;

ifstream hFile1;
hFile1.open("opengl.vert");//"ShaderVertex.txt");

if (hFile1)
{
    while (hFile1.getline(line, MAX_LENGTH))
    {
        Context1.push_back(string(line));
        ++lines1;
    }
    hFile1.close();
}
else
{
    MessageBeep(16);
    exit(1);
}

char* ShaderTextVert[lines1];

for (int i = 0; i < lines1; ++i)
    ShaderTextVert[i] = (char*)Context1[i].c_str();

// ======= /Read vertex shader =======


// ======= Read vertex shader =======


vector<string> Context2;

ifstream hFile2;
hFile2.open("opengl.frag");
if (hFile2)
{
    while (hFile2.getline(line, MAX_LENGTH))
    {
        Context2.push_back(string(line));
        ++lines2;
    }
    hFile2.close();
}
else
{
    MessageBeep(16);
    exit(1);
}

char* ShaderTextFrag[lines2];

for (int i = 0; i < lines2; ++i)
    ShaderTextFrag[i] = (char*)Context2[i].c_str();

// ======= /Read vertex shader =======


glShaderSourceARB(VertexShaderObject, lines1, (const char**)ShaderTextVert, NULL);
glShaderSourceARB(FragmentShaderObject, lines2, (const char**)ShaderTextFrag, NULL);
    
free(ShaderTextVert);
free(ShaderTextFrag);

// glSlang functions


glCompileShaderARB(VertexShaderObject);
glCompileShaderARB(FragmentShaderObject);

glAttachObjectARB(ProgramObject, VertexShaderObject);
glAttachObjectARB(ProgramObject, FragmentShaderObject);

glDeleteObjectARB(VertexShaderObject);
glDeleteObjectARB(FragmentShaderObject);

glLinkProgramARB(ProgramObject);

glUseProgramObjectARB(ProgramObject);

/*****/GL SLANG *****/

Wisst ihr was da noch fehlt oder falsch ist? Muss ich da von was un-unterbrochen in der Hauptschleife aufrufen. Bitte helft mir :)

2

02.07.2008, 11:06

Keine Ahnung! Um Shader zu benutzen, muss natuerlich erstmal was gerendert werden. Die Shader wirken ja auf was. Vielleicht hilft http://lighthouse3d.com/opengl/glsl/index.php?ogloverview . Da gibt es einen eigenen Bereich fuer trouble shooting. Vielleicht hast du einen Fehler im Shader etc. ...

Desweiteren enthaelt dein Beispiel komische Sachen:

Das bewirkt nichts:

Quellcode

1
2
glDeleteObjectARB(VertexShaderObject);
glDeleteObjectARB(FragmentShaderObject);


Malloc und free gehoeren zusammen, du benutzt kein malloc, also rufe auch nicht free auf.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char* ShaderTextVert[lines1];

for (int i = 0; i < lines1; ++i)
    ShaderTextVert[i] = (char*)Context1[i].c_str(); 
...

char* ShaderTextFrag[lines2];

for (int i = 0; i < lines2; ++i)
    ShaderTextFrag[i] = (char*)Context2[i].c_str();
...
   
free(ShaderTextVert);
free(ShaderTextFrag);