#1
|
|||
|
|||
Multiple Textures for Diffuse and Specularity Shader Issue
Hello again,
I am having a small issue with the shader I had posted earlier (Phong lighting shader). In my shader I am moving between two textures through the UV coordinates with a value that ranges between zero to one. I am also using two additional textures to control the specularity across the surface of the two textures. The blending and the phong shader work just fine. The issue I am having is that the specular highlight does not seem to be respecting the specular textures I load. If I only use 2 textures and assign the first to the 0 layer and the second to the 1 layer and use those to control the specular highlight everything is fine. But as soon as I try to use more than two textures everything seems to blow up and all I get is a model with the standard Phong specular highlight running along the length. Any help would be greatly appreciated. Vizard Script Code:
import viz from Shaders import Phong_TexBlend viz.sensitivity(3,0.5) viz.go() #Get a handle to the main headlight and disable it headLight = viz.MainView.getHeadLight() headLight.disable() viz.MainView.setPosition(-3.4, 1.8, -104.5) #Load Models Bottom = viz.add("Models\\Bottom.obj") Top = viz.add("Models\\Top.obj") Clamp = viz.add("Models\\Clamp.obj") #Load Textures TexMap_1 = viz.addTexture("Textures\\BrushedSteel_TexMap.bmp") TexMap_2 = viz.addTexture("Textures\\IceCrystals_TexMap.bmp") SpecMap_1 = viz.addTexture("Textures\\BrushedSteel_SpecMap.bmp") SpecMap_2 = viz.addTexture("Textures\\IceCrystals_SpecMap.bmp") #Associate Textures with Models Top.texture(TexMap_1, '' ,0) Top.texture(TexMap_2, '' ,1) Top.texture(SpecMap_1, '' ,2) Top.texture(SpecMap_2, '' ,3) #Create Shaders TopShader = Phong_TexBlend() #Apply Shaders to Geometry TopShader.ApplyShader(Top) Code:
#Shader - Phong #Created by: George Lecakes #May 08, 2009 import viz class Phong_TexBlend: def __init__(self): #Variables to manipulate Shader self.lightposition = [-60, -16, 20] self.ambient = [0.0,0.0,0.0,1.0] self.diffuse = [0.7882,0.7970,0.7862,1.0] self.specular = [0.814,0.814,0.814,1.0] self.specularpower = 4.96 self.frostline = 0.5 #Load the Vertex and Fragment Shaders, which should always accomany this file and be labeled .vp and .fp self.shader = viz.addShader(flag = 0, vert = "Vertex_Fragments\\Shader_Phong.vp", frag = "Vertex_Fragments\\Shader_Phong.fp") #Add Uniform Variables from Vertex Shader self.LightPosition = viz.addUniformFloat( 'fvLightPosition', self.lightposition ) self.EyePosition = viz.addUniformFloat( 'fvEyePosition', [0.0,0.0,0.0] ) #AddUniform Variables from Fragment Shader self.Ambient = viz.addUniformFloat( 'fvAmbient', self.ambient ) self.Specular = viz.addUniformFloat( 'fvSpecular', self.specular ) self.Diffuse = viz.addUniformFloat( 'fvDiffuse', self.diffuse ) self.SpecularPower = viz.addUniformFloat( 'fSpecularPower', self.specularpower ) self.TexMap_1 = viz.addUniformBool( 'TexMap_1', 0 ) self.TexMap_2 = viz.addUniformBool( 'TexMap_2', 1 ) self.SpecMap_1 = viz.addUniformBool( 'SpecMap_1', 2 ) self.SpecMap_2 = viz.addUniformBool( 'SpecMap_2', 3 ) self.FrostLine = viz.addUniformFloat( 'FrostLine', self.frostline) #Attach the uniform variables to the shader self.shader.attach(self.Ambient) self.shader.attach(self.Specular) self.shader.attach(self.Diffuse) self.shader.attach(self.SpecularPower) self.shader.attach(self.TexMap_1) self.shader.attach(self.TexMap_2) self.shader.attach(self.SpecMap_1) self.shader.attach(self.SpecMap_2) self.shader.attach(self.FrostLine) def ApplyShader(self, node): node.apply(self.shader) def SetFrostLine(self, fl): self.FrostLine.set(fl) Code:
uniform vec3 fvLightPosition; uniform vec3 fvEyePosition; varying vec2 Texcoord; varying vec3 ViewDirection; varying vec3 LightDirection; varying vec3 Normal; void main( void ) { gl_Position = ftransform(); Texcoord = gl_MultiTexCoord0.xy; vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex; ViewDirection = fvEyePosition - fvObjectPosition.xyz; LightDirection = fvLightPosition - fvObjectPosition.xyz; Normal = gl_NormalMatrix * gl_Normal; } Code:
uniform vec4 fvAmbient; uniform vec4 fvSpecular; uniform vec4 fvDiffuse; uniform float fSpecularPower; uniform sampler2D TexMap_1; uniform sampler2D TexMap_2; uniform sampler2D SpecMap_1; uniform sampler2D SpecMap_2; uniform float FrostLine; varying vec2 Texcoord; varying vec3 ViewDirection; varying vec3 LightDirection; varying vec3 Normal; void main( void ) { vec3 fvLightDirection = normalize( LightDirection ); vec3 fvNormal = normalize( Normal ); float fNDotL = dot( fvNormal, fvLightDirection ); vec3 fvReflection = normalize( ( ( 2.0 * fvNormal ) * fNDotL ) - fvLightDirection ); vec3 fvViewDirection = normalize( ViewDirection ); float fRDotV = max( 0.0, dot( fvReflection, fvViewDirection ) ); //Separate into two areas, that above frost line (Use First set) if (Texcoord.y > FrostLine) { vec4 fvBaseColor = texture2D( TexMap_1, Texcoord ); vec4 fvTotalAmbient = fvAmbient * fvBaseColor; vec4 fvTotalDiffuse = fvDiffuse * fNDotL * fvBaseColor; vec4 fvTotalSpecular = fvSpecular * ( pow( fRDotV, fSpecularPower ) ) * texture2D(SpecMap_1, Texcoord); gl_FragColor = ( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular ); } //Area below frost line (Use second set of textures) else { vec4 fvBaseColor = texture2D( TexMap_2, Texcoord ); vec4 fvTotalAmbient = fvAmbient * fvBaseColor; vec4 fvTotalDiffuse = fvDiffuse * fNDotL * fvBaseColor; vec4 fvTotalSpecular = fvSpecular * ( pow( fRDotV, fSpecularPower ) ) * texture2D(SpecMap_2, Texcoord); gl_FragColor = ( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular ); } } ~George |
#2
|
|||
|
|||
You are using a boolean uniform to specify the texture uniforms, you should be using an integer uniform, addUniformInt.
|
|
|