Texgen and per pixel lighting!
here it is... render state pp LightPoint...
void OpenGL::SetLightPoint(RS_LightPoint *in_state, Primitive *in_primitive)
{
glBlendFunc(GL_DST_COLOR, GL_ZERO);
glEnable(GL_BLEND);
GLfloat l_radius = 5.0f;
GLfloat l_intensity = 1.0f / l_radius;
Vector3 l_lightPosition = Vector3(3.0f, 1.0f, 0.0f);
GLfloat l_plane_x[4] = {l_intensity, 0.0f, 0.0f, 0.5f - l_lightPosition.x / l_radius};
GLfloat l_plane_y[4] = {0.0f, l_intensity, 0.0f, 0.5f - l_lightPosition.y / l_radius};
GLfloat l_plane_z[4] = {0.0f, 0.0f, l_intensity, 0.5f - l_lightPosition.z / l_radius};
GLfloat l_plane_w[4] = {0.0f, 0.0f, 0.0f, 1.0f};
Texture *l_texture;
// Texture 2D radial map texture.
l_texture = in_state->GetScopeMap();
glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, (GLuint) in_texture->GetImageData());
glEnable(GL_TEXTURE_2D);
glTexGenfv(GL_S, GL_EYE_PLANE, l_plane_x);
glTexGenfv(GL_T, GL_EYE_PLANE, l_plane_y);
glTexGenfv(GL_R, GL_EYE_PLANE, l_plane_z);
glTexGenfv(GL_Q, GL_EYE_PLANE, l_plane_w);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glEnable(GL_TEXTURE_GEN_Q);
// Texture 1D linear ramp texture.
l_texture = in_state->GetRayMap();
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_1D, (GLuint) in_texture->GetImageData());
glEnable(GL_TEXTURE_1D);
glTexGenfv(GL_S, GL_EYE_PLANE, l_plane_z);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glEnable(GL_TEXTURE_GEN_S);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_SUBTRACT_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_ONE_MINUS_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
glDrawElements(GL_QUADS, in_primitive->GetVertexCount(), GL_UNSIGNED_INT, in_primitive->GetQuad());
glActiveTextureARB(GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_1D);
glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}
it is difficult to make it simple! but i think we are getting there... the only thing missing here (I think) its the right equation for the l_plane_*... and tadam... per pixel lighting... the rest is pretty much rock solide! can someone help finding the right equation?
Thx
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement