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