View Single Post
  #1  
Old 05-08-2009, 12:01 PM
shivanangel shivanangel is offline
Member
 
Join Date: Feb 2006
Location: New Jersey
Posts: 182
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)
Phong Texture Blend Class

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)
Vertex Shader

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;
   
}
Fragment Shader

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 );
   
   }
       
}
Once again, I am probably making some horribly novice mistake and I apologize if that is the case again.

~George
Reply With Quote