Brokenmind
Diablo-Veteran
- Registriert
- 20 Mai 2007
- Beiträge
- 1.510
:hy: 
Ja, mir ist klar, dass ich das auch in einem "Fach-Forum" hätte posten können, aber da dieses Problem doch sehr speziell ist, dachte ich, das altbekannte Forum tuts auch. Außerdem wisst Ihr doch ohnehin viel mehr
Problem: openGL (c++)
im Phong-Shader werden keine Texturen abgebildet,
im Texture-Shader sieht alles wie ein großes Puzzle aus.
Lösung wäre, beide Shader irgendwie miteinander zu kombinieren. Aber wie
Phong-Fragment:
Phong-Vertex:
Texture-Fragment:
Texture-Vertex:
in Google gefunden hab ich zwar das hier, aber das ist wohl alles Javascript; außerdem blick ich generell durch die Shader Language nicht durch.
Also, wie immer: Falls es jemanden gibt, der das Problem kennt oder der wen kennt der wen kennt der das Problem kennt (und es zu lösen vermag)
, bitte ich ihn/sie, es mir zu erklären 
PS: Der Texture-Shader holt sich immer die erste Textur auf dem Stack, egal ob sie aktiviert oder deaktiviert ist... kann man diesen Textur-Hunger irgendwie zügeln?
Greetz
Brokenmind

Ja, mir ist klar, dass ich das auch in einem "Fach-Forum" hätte posten können, aber da dieses Problem doch sehr speziell ist, dachte ich, das altbekannte Forum tuts auch. Außerdem wisst Ihr doch ohnehin viel mehr

Problem: openGL (c++)
im Phong-Shader werden keine Texturen abgebildet,
im Texture-Shader sieht alles wie ein großes Puzzle aus.
Lösung wäre, beide Shader irgendwie miteinander zu kombinieren. Aber wie

Phong-Fragment:
Code:
// Phong fragment shader
varying vec3 normal;
varying vec4 position;
void calculateLighting( int light, vec3 N, vec3 V3 )
{
vec3 VP;
if ( gl_LightSource[light].position.w == 0.0 )
{
VP = normalize( gl_LightSource[light].position.xyz );
}
else
{
VP = normalize( vec3( gl_LightSource[light].position / gl_LightSource[light].position.w ) - V3 );
}
vec3 R = normalize( -reflect( VP, N ) );
vec3 E = normalize( -V3 );
float VPdotNf = dot( VP, N );
float VPdotNb = -VPdotNf;
VPdotNf = max( VPdotNf, 0.0 );
VPdotNb = max( VPdotNb, 0.0 );
float ff, fb;
if (VPdotNf == 0.0)
{
ff = 0.0;
}
else
{
ff = pow( max( dot( R, E ), 0.0 ), gl_FrontMaterial.shininess * 0.25 );
}
if (VPdotNb == 0.0)
{
fb = 0.0;
}
else
{
fb = pow( max( dot( R, E ), 0.0 ), gl_BackMaterial.shininess * 0.25 );
}
if (gl_FrontFacing)
{
gl_FragColor += gl_FrontMaterial.ambient * gl_LightSource[light].ambient +
gl_FrontMaterial.diffuse * gl_LightSource[light].diffuse * VPdotNf +
ff * gl_FrontMaterial.specular * gl_LightSource[light].specular;
}
else
{
gl_FragColor += gl_BackMaterial.ambient * gl_LightSource[light].ambient +
gl_BackMaterial.diffuse * gl_LightSource[light].diffuse * VPdotNb +
fb * gl_BackMaterial.specular * gl_LightSource[light].specular;
}
}
void main()
{
vec4 V;
vec3 N, V3;
V = position;
if ( V.w != 0.0 )
{
V3 = vec3( V ) / V.w;
}
else
{
V3 = vec3( V );
}
N = normalize( normal );
if ( gl_FrontFacing )
{
gl_FragColor = gl_FrontMaterial.emission +
gl_FrontMaterial.ambient * gl_LightModel.ambient;
}
else
{
gl_FragColor = gl_BackMaterial.emission +
gl_BackMaterial.ambient * gl_LightModel.ambient;
}
//calculateLighting( 0, N, V3 );
//calculateLighting( 1, N, V3 );
calculateLighting( 2, N, V3 );
calculateLighting( 3, N, V3 );
//calculateLighting( 4, N, V3 );
gl_FragColor.a = 1.0;
}
Phong-Vertex:
Code:
// Shared vertex shader
varying vec3 normal;
varying vec4 position;
void main()
{
normal = normalize( gl_NormalMatrix * gl_Normal );
position = gl_ModelViewMatrix * gl_Vertex;
gl_Position = ftransform();
}
Texture-Fragment:
Code:
varying vec3 lightDir,normal;
uniform sampler2D tex;
void main()
{
vec3 ct,cf;
vec4 texel;
float intensity,at,af;
intensity = max(dot(lightDir,normalize(normal)),0.0);
cf = intensity * (gl_FrontMaterial.diffuse).rgb +
gl_FrontMaterial.ambient.rgb;
af = gl_FrontMaterial.diffuse.a;
texel = texture2D(tex,gl_TexCoord[0].st);
ct = texel.rgb;
at = texel.a;
gl_FragColor = vec4(ct * cf, at * af);
}
Texture-Vertex:
Code:
varying vec3 lightDir,normal;
void main()
{
normal = normalize(gl_NormalMatrix * gl_Normal);
lightDir = normalize(vec3(gl_LightSource[0].position));
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
in Google gefunden hab ich zwar das hier, aber das ist wohl alles Javascript; außerdem blick ich generell durch die Shader Language nicht durch.
Also, wie immer: Falls es jemanden gibt, der das Problem kennt oder der wen kennt der wen kennt der das Problem kennt (und es zu lösen vermag)
, bitte ich ihn/sie, es mir zu erklären 
PS: Der Texture-Shader holt sich immer die erste Textur auf dem Stack, egal ob sie aktiviert oder deaktiviert ist... kann man diesen Textur-Hunger irgendwie zügeln?
Greetz
Brokenmind


, Beispiele in C++ hab ich wie gesagt nicht gefunden, aber das was in dem verlinkten Thread steht, unterscheidet sich doch grundlegend von meinem Shader-Inhalt, wie soll man das verwenden können? 
oder
dieses Metier ist mir noch etwas fremd~
)
@Pitti: wie kann man per glUniform{xx} denn characters oder ein character-array übergeben? glUniform1cv o.ä. gibts nicht