Hi.
Ich hab mir mal ein paar weitere Beispiele für Shader rausgesucht. Unter anderem bin ich bei diesem Beispiel hier gelandet:
Vertexshader:
Code: // // Authors: Dave Baldwin, Steve Koren, Randi Rost // based on a shader by Darwyn Peachey // // Copyright (c) 2002-2006 3Dlabs Inc. Ltd. // // See 3Dlabs-License.txt for license information // uniform vec3 LightPosition; const float SpecularContribution = 0.3; const float DiffuseContribution = 1.0 - SpecularContribution; varying float LightIntensity; varying vec2 MCposition; void main(void) { vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex); vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal); vec3 lightVec = normalize(LightPosition - ecPosition); vec3 reflectVec = reflect(-lightVec, tnorm); vec3 viewVec = normalize(-ecPosition); float diffuse = max(dot(lightVec, tnorm), 0.0); float spec = 0.0; if (diffuse > 0.0) { spec = max(dot(reflectVec, viewVec), 0.0); spec = pow(spec, 16.0); } LightIntensity = DiffuseContribution * diffuse + SpecularContribution * spec; MCposition = gl_Vertex.xy; gl_Position = ftransform(); }
Fragmentshader:
Code: // // Fragment shader for procedural bricks // // Authors: Dave Baldwin, Steve Koren, Randi Rost // based on a shader by Darwyn Peachey // // Copyright (c) 2002-2006 3Dlabs Inc. Ltd. // // See 3Dlabs-License.txt for license information // uniform vec3 BrickColor, MortarColor; uniform vec2 BrickSize; uniform vec2 BrickPct; varying vec2 MCposition; varying float LightIntensity; void main(void) { vec3 color; vec2 position, useBrick; position = MCposition / BrickSize; if (fract(position.y * 0.5) > 0.5) position.x += 0.5; position = fract(position); useBrick = step(position, BrickPct); color = mix(MortarColor, BrickColor, useBrick.x * useBrick.y); color *= LightIntensity; gl_FragColor = vec4 (color, 1.0); }
Wie in den Shadern ja schon drin steht sollen sie was prozedural mit Ziegelsteinen "einfärben".
So, und jetzt kommt mein Problem - wenn ich das ProgramObject so benutze wie in den Tutorials hier im Wiki, also:
Code: glTranslatef(0, 0, -10); //Parameterübergabe und Hintergrund zeichnen: //[...] //[...] //Programobjekt aktivieren und Quadrat zeichnen auf das es wirken soll: glUseProgramObjectARB(ProgramObject); glBegin(GL_QUADS); glVertex3f(-1, -1, 1); glVertex3f(1, -1, 1); glVertex3f(1, 1, 1); glVertex3f(-1, 1, 1); glEnd; glUseProgramObjectARB(0); SwapBuffers(DC);
Seh ich nur ein schwarzes Quadrat
bei
Code: glTranslatef(0, 0, -10); //Parameterübergabe und Hintergrund zeichnen: //[...] //[...] //Programobjekt aktivieren und Quadrat zeichnen auf das es wirken soll: glUseProgramObjectARB(ProgramObject); glBegin(GL_QUADS); glVertex3f(-1, -1, 1); glVertex3f(1, -1, 1); glVertex3f(1, 1, 1); glVertex3f(-1, 1, 1); glEnd; SwapBuffers(DC);
wird hingegen alles in Ziegelsteinen gezeichnet (auch der Hintergrund)...
Tja und jetzt wüsste ich gerne woran das liegt und wie ich das beheben kann...
cya,
Deathball
|