![]() |
|
|
|
#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.
|
![]() |
|
|