- procedure SetTextureStageRGB(param1, op, param2 : Integer);
- begin
- glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_ARB);
- glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB,op);
- glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE0_RGB_ARB,param1);
- glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND0_RGB_ARB,GL_SRC_COLOR);
- glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE1_RGB_ARB,param2);
- glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND1_RGB_ARB,GL_SRC_COLOR);
- glTexEnvi(GL_TEXTURE_ENV,GL_RGB_SCALE_ARB,1);
- end;
- procedure SetTextureStageAlpha(param1, op, param2 : Integer);
- begin
- glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_ARB);
- glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,op);
- glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE0_ALPHA_ARB,param1);
- glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND0_ALPHA_ARB,GL_SRC_ALPHA);
- glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE1_ALPHA_ARB,param2);
- glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND1_ALPHA_ARB,GL_SRC_ALPHA);
- glTexEnvi(GL_TEXTURE_ENV,GL_ALPHA_SCALE,1);
- end;
- procedure ResetTextureStage(mode : Integer);
- begin
- glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,mode);
- glTexEnvi(GL_TEXTURE_ENV,GL_RGB_SCALE_ARB,1);
- glTexEnvi(GL_TEXTURE_ENV,GL_ALPHA_SCALE,1);
- end;
- procedure TR3DLight.beginLightIntensity;
- begin
- // Nur Alpha Kanal nehmen
- glColorMask(False,False,False,True);
- // Alpha Kanal überschreiben
- glBlendFunc(GL_ONE, GL_ZERO);
- glDisable(GL_BLEND);
- // 2D Attenuation map
- gTextureAtt2D.BindMultiTexture(0);
- SetTextureStageAlpha(GL_PRIMARY_COLOR_ARB,GL_SUBTRACT,GL_TEXTURE);
- // 1D Attenuation map
- gTextureAtt1D.BindMultiTexture(1);
- SetTextureStageAlpha(GL_PREVIOUS_ARB,GL_SUBTRACT,GL_TEXTURE);
- end;
- procedure TR3DLight.processLightIntensityVertex(const _Vertex : TR3DVector);
- var
- texCoords : TR3DVector;
- versuborig : TR3DVector;
- begin
- // Texture Koordinaten berechnen für Lightmap
- versuborig := r3d_VectorSub(_Vertex, Position);
- texCoords := r3d_VectorDiv(versuborig, Radius * 2.0);
- texCoords.Add(0.5);
- glMultiTexCoord2fARB(GL_TEXTURE0_ARB, texCoords.x, texCoords.y);
- glMultiTexCoord1fARB(GL_TEXTURE1_ARB, texCoords.z);
- glVertex3fv(@_Vertex);
- end;
- procedure TR3DLight.endLightIntensity;
- begin
- // 1D Attenuation map
- glActiveTextureARB(GL_TEXTURE1_ARB);
- glDisable(GL_TEXTURE_1D);
- ResetTextureStage(GL_MODULATE);
- // 2D Attenuation map
- glActiveTextureARB(GL_TEXTURE0_ARB);
- ResetTextureStage(GL_MODULATE);
- // Nur Alpha aus
- glColorMask(True,True,True,True);
- end;
- procedure TR3DLight.beginDiffuseBumpmapping;
- begin
- // Nur Alpha Kanal nehmen
- glColorMask(False,False,False,True);
- // Alpha Kanal überschreiben
- glBlendFunc(GL_SRC_ALPHA, GL_ZERO);
- glEnable(GL_BLEND);
- // Normalization Cubemap
- gNormalizationCubemap.BindMultiTexture(1);
- SetTextureStageRGB(GL_PREVIOUS_ARB,GL_DOT3_RGBA,GL_TEXTURE);
- // Bumpmap
- glActiveTextureARB(GL_TEXTURE0_ARB);
- glEnable(GL_TEXTURE_2D);
- SetTextureStageRGB(GL_TEXTURE,GL_REPLACE,GL_TEXTURE);
- end;
- procedure TR3DLight.processDiffuseBumpmappingVertex(const _Vertex : TR3DVector; const _BumpCoord : TR3DTexcoord; const _Light : TR3DVector);
- begin
- glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, @_BumpCoord);
- glMultiTexCoord3fvARB(GL_TEXTURE1_ARB, @_Light);
- glVertex3fv(@_Vertex);
- end;
- procedure TR3DLight.endDiffuseBumpmapping;
- begin
- // Normalization Cubemap
- glActiveTextureARB(GL_TEXTURE1_ARB);
- glDisable(GL_TEXTURE_CUBE_MAP_EXT);
- ResetTextureStage(GL_MODULATE); // Modulate muss rein, ansonsten gehen Farben nicht mehr :(
- // Bumpmap
- glActiveTextureARB(GL_TEXTURE0_ARB);
- ResetTextureStage(GL_MODULATE); // Modulate muss rein, ansonsten gehen Farben nicht mehr :(
- // Nur Alpha aus
- glColorMask(True,True,True,True);
- end;
- procedure TR3DLight.beginDiffuse;
- begin
- glBlendFunc(GL_DST_ALPHA, GL_ONE);
- glEnable(GL_BLEND);
- // Keine Texture
- glActiveTextureARB(GL_TEXTURE1_ARB);
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_TEXTURE_CUBE_MAP_EXT);
- // Decal Texture
- glActiveTextureARB(GL_TEXTURE0_ARB);
- glEnable(GL_TEXTURE_2D);
- // Licht Farbe
- glColor3ubv(@Color);
- end;
- procedure TR3DLight.processDiffuseVertex(const _Vertex : TR3DVector; const _Texcoord : TR3DTexcoord);
- begin
- glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, @_Texcoord);
- glVertex3fv(@_Vertex);
- end;
- procedure TR3DLight.endDiffuse;
- begin
- glActiveTextureARB(GL_TEXTURE0_ARB);
- glColor3ub(255,255,255);
- end;