Hi,
ich versuche gerade mir die Shader beizubringen. Dafür render ich einfach ein Quad und wollte darauf den Holz Shader loslassen. Hier die zwei Shader von der oben genannten Quelle:
Vertex Shader
Code: varying float LightIntensity; varying vec3 MCposition; uniform vec3 LightPos; uniform float Scale; void main(void) { vec3 ECposition = vec3 (gl_ModelViewMatrix * gl_Vertex); MCposition = vec3 (gl_Vertex) * Scale; vec3 tnorm = normalize(vec3 (gl_NormalMatrix * gl_Normal)); LightIntensity = dot(normalize(LightPos - ECposition), tnorm); LightIntensity *= 1.5; gl_Position = ftransform(); }
und hier der Fragment Shader:
Code: varying float LightIntensity; varying vec3 MCposition; uniform sampler3D Noise; uniform vec3 LightWoodColor; uniform vec3 DarkWoodColor; uniform float RingFreq; uniform float LightGrains; uniform float DarkGrains; uniform float GrainThreshold; uniform vec3 NoiseScale; uniform float Noisiness; uniform float GrainScale; void main(void) { vec3 noisevec = vec3 (texture3D(Noise, MCposition * NoiseScale) * Noisiness); vec3 location = MCposition + noisevec; float dist = sqrt(location.x * location.x + location.z * location.z); dist *= RingFreq; float r = fract(dist + noisevec[0] + noisevec[1] + noisevec[2]) * 2.0; if (r > 1.0) r = 2.0 - r; vec3 color = mix(LightWoodColor, DarkWoodColor, r); r = fract((MCposition.x + MCposition.z) * GrainScale + 0.5); noisevec[2] *= r; if (r < GrainThreshold) color += LightWoodColor * LightGrains * noisevec[2]; else color -= LightWoodColor * DarkGrains * noisevec[2]; color *= LightIntensity; gl_FragColor = vec4 (color, 1.0); }
Zu Beginn generiere ich mir die 3D Noise Textur durch einfache Zufallszahlen, danach mach ich sie OpenGL bekannt durch
Code: glGenTextures(1, &textures[TEX_3DNOISE]); glBindTexture(GL_TEXTURE_3D, textures[TEX_3DNOISE]); glTexImage3D(GL_TEXTURE_3D, 0, 3, _hwl, _hwl, _hwl, 0, GL_RGB, GL_UNSIGNED_BYTE, texdata); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Danach initialisiere ich Slang mit dem folgenden Quellcode:
Code: sl_po=glCreateProgramObjectARB(); sl_vs=glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); sl_fs=glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); char *fn1=0; char *fn2=0; readfromfile("Shader/wood.vert", &fn1); glShaderSourceARB(sl_vs, 1, (const char**)&fn1, 0); readfromfile("Shader/wood.frag", &fn2); glShaderSourceARB(sl_fs, 1, (const char**)&fn2, 0); glCompileShaderARB(sl_vs); slang_error(sl_vs); glCompileShaderARB(sl_fs); slang_error(sl_fs); glAttachObjectARB(sl_po, sl_vs); glAttachObjectARB(sl_po, sl_fs); glDeleteObjectARB(sl_vs); glDeleteObjectARB(sl_fs); glLinkProgramARB(sl_po); slang_error(sl_po); glUseProgramObjectARB(sl_po);
Danach setze ich die Variablen im Shader Programm:
Code: float lightPos[3] = {0.0f, 0.0f, 2.0f}; float darkwood[3] = {0.4f, 0.2f, 0.07f}; float lightwood[3] = {0.6f, 0.3f, 0.1f}; float scale = 2.0f; float ringfreq = 4.0f; float lightgrains = 1.0f; float darkgrains = 0.0f; float grainthreshold = 0.5f; float noisescale[3] = {0.5f, 0.1f, 0.1f}; float noisiness = 3.0; float grainscale = 27.0; glUniform1iARB(glGetUniformLocationARB(sl_po, "Noise"), 0); glUniform1fvARB(glGetUniformLocationARB(sl_po, "Scale"), 1, &scale); glUniform3fvARB(glGetUniformLocationARB(sl_po, "LightPos"), 3, &lightPos[0]); glUniform3fvARB(glGetUniformLocationARB(sl_po, "DarkWoodColor"), 3, &darkwood[0]); glUniform3fvARB(glGetUniformLocationARB(sl_po, "LightWoodColor"), 3, &lightwood[0]); glUniform1fvARB(glGetUniformLocationARB(sl_po, "RingFreq"), 1, &ringfreq); glUniform1fvARB(glGetUniformLocationARB(sl_po, "LightGrains"), 1, &lightgrains); glUniform1fvARB(glGetUniformLocationARB(sl_po, "DarkGrains"), 1, &darkgrains); glUniform1fvARB(glGetUniformLocationARB(sl_po, "GrainThreshold"), 1, &grainthreshold); glUniform3fvARB(glGetUniformLocationARB(sl_po, "NoiseScale"), 3, &noisescale[0]); glUniform1fvARB(glGetUniformLocationARB(sl_po, "Noisiness"), 1, &noisiness); glUniform1fvARB(glGetUniformLocationARB(sl_po, "GrainScale"), 1, &grainscale);
Das Rendern ansich ist nicht weiter spektakulär:
Code: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glTranslatef(0.0f, 0.0f, -20.0f); glColor3f(0.0f, 0.0f, 1.0f); glBegin(GL_QUADS); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glEnd(); glutSwapBuffers();
Die Shader-Initialisierung läuft ohne Fehler durch, nur der Bildschirm bleibt leider schwarz, so dass ich dachte, dass es vielleicht an den übergebenen Shader-Parameter liegt oder dass ich die 3d Textur noch irgendwie dem Shader bekannt machen muß.
Viele Dank,
Najo
|