Updated gObjectPreviewProgram shader (simple lighting)
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
* @file previewF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
|
||||
frag_color = color;
|
||||
}
|
||||
@@ -32,12 +32,51 @@ ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec3 normal;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
uniform vec4 color;
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
uniform vec4 light_position[8];
|
||||
uniform vec3 light_direction[8];
|
||||
uniform vec3 light_attenuation[8];
|
||||
uniform vec3 light_diffuse[8];
|
||||
|
||||
//===================================================================================================
|
||||
//declare these here explicitly to separate them from atmospheric lighting elsewhere to work around
|
||||
//drivers that are picky about functions being declared but not defined even if they aren't called
|
||||
float calcDirectionalLight(vec3 n, vec3 l)
|
||||
{
|
||||
float a = max(dot(n,l),0.0);
|
||||
return a;
|
||||
}
|
||||
|
||||
|
||||
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight)
|
||||
{
|
||||
//get light vector
|
||||
vec3 lv = lp.xyz-v;
|
||||
|
||||
//get distance
|
||||
float d = length(lv);
|
||||
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
|
||||
//distance attenuation
|
||||
float da = clamp(1.0/(la * d), 0.0, 1.0);
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
|
||||
return da;
|
||||
}
|
||||
//====================================================================================================
|
||||
|
||||
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
void main()
|
||||
{
|
||||
@@ -45,13 +84,15 @@ void main()
|
||||
vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
||||
|
||||
vec3 norm = normalize(normal_matrix * normal);
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
vec4 col = vec4(0,0,0,1);
|
||||
|
||||
vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.));
|
||||
vertex_color = color;
|
||||
|
||||
|
||||
// Collect normal lights (need to be divided by two, as we later multiply by 2)
|
||||
col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
|
||||
col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
|
||||
col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
|
||||
|
||||
vertex_color = col*color;
|
||||
}
|
||||
|
||||
@@ -1641,7 +1641,6 @@ bool LLModelLoader::doLoadModel()
|
||||
|
||||
//If no skeleton, do a breadth-first search to get at specific joints
|
||||
bool rootNode = false;
|
||||
bool skeletonWithNoRootNode = false;
|
||||
|
||||
//Need to test for a skeleton that does not have a root node
|
||||
//This occurs when your instance controller does not have an associated scene
|
||||
@@ -1652,10 +1651,6 @@ bool LLModelLoader::doLoadModel()
|
||||
{
|
||||
rootNode = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
skeletonWithNoRootNode = true;
|
||||
}
|
||||
|
||||
}
|
||||
if (!pSkeleton || !rootNode)
|
||||
@@ -5034,6 +5029,11 @@ BOOL LLModelPreview::render()
|
||||
refresh();
|
||||
}
|
||||
|
||||
if (use_shaders)
|
||||
{
|
||||
gObjectPreviewProgram.bind();
|
||||
}
|
||||
|
||||
gGL.loadIdentity();
|
||||
gPipeline.enableLightsPreview();
|
||||
|
||||
@@ -5043,8 +5043,9 @@ BOOL LLModelPreview::render()
|
||||
LLQuaternion av_rot = camera_rot;
|
||||
LLViewerCamera::getInstance()->setOriginAndLookAt(
|
||||
target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot), // camera
|
||||
LLVector3::z_axis, // up
|
||||
target_pos); // point of interest
|
||||
LLVector3::z_axis, // up
|
||||
target_pos); // point of interest
|
||||
|
||||
|
||||
z_near = llclamp(z_far * 0.001f, 0.001f, 0.1f);
|
||||
|
||||
@@ -5058,11 +5059,6 @@ BOOL LLModelPreview::render()
|
||||
|
||||
const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
|
||||
|
||||
if (use_shaders)
|
||||
{
|
||||
gObjectPreviewProgram.bind();
|
||||
}
|
||||
|
||||
LLGLEnable normalize(GL_NORMALIZE);
|
||||
|
||||
if (!mBaseModel.empty() && mVertexBuffer[5].empty())
|
||||
@@ -5248,10 +5244,10 @@ BOOL LLModelPreview::render()
|
||||
|
||||
if (i + 1 >= hull_colors.size())
|
||||
{
|
||||
hull_colors.push_back(LLColor4U(rand()%128 + 127, rand()%128 + 127, rand()%128 + 127, 128));
|
||||
hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
|
||||
}
|
||||
|
||||
glColor4ubv(hull_colors[i].mV);
|
||||
gGL.diffuseColor4ubv(hull_colors[i].mV);
|
||||
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
|
||||
|
||||
if (explode > 0.f)
|
||||
|
||||
@@ -1887,18 +1887,19 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
||||
if (success)
|
||||
{
|
||||
gObjectPreviewProgram.mName = "Simple Shader";
|
||||
gObjectPreviewProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectPreviewProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectPreviewProgram.mFeatures.hasGamma = true;
|
||||
gObjectPreviewProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectPreviewProgram.mFeatures.hasLighting = true;
|
||||
gObjectPreviewProgram.mFeatures.calculatesLighting = false;
|
||||
gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false;
|
||||
gObjectPreviewProgram.mFeatures.hasGamma = false;
|
||||
gObjectPreviewProgram.mFeatures.hasAtmospherics = false;
|
||||
gObjectPreviewProgram.mFeatures.hasLighting = false;
|
||||
gObjectPreviewProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectPreviewProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectPreviewProgram.mShaderFiles.clear();
|
||||
gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectPreviewProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectPreviewProgram.createShader(NULL, NULL);
|
||||
gObjectPreviewProgram.mFeatures.hasLighting = true;
|
||||
}
|
||||
|
||||
if (success)
|
||||
|
||||
Reference in New Issue
Block a user