DGL
https://delphigl.com/forum/

Fog and GL_Blend
https://delphigl.com/forum/viewtopic.php?f=19&t=3379
Seite 1 von 1

Autor:  Stucuk [ Mi Okt 20, 2004 02:58 ]
Betreff des Beitrags:  Fog and GL_Blend

Iv ran into a problem when implementing fog, faces that use gl_blend don't seem to be affected by the fog.

Screenshots below:

Dateianhänge:
Dateikommentar: Dark.BSP - Shaders On (Ignore the seethrough sky, look at the windows at the bottom left)
DARK_002_small.jpg [156.66 KiB]
60-mal heruntergeladen
Dateikommentar: Dark.BSP - Shaders Off (Means no faces wih gl_blend)
DARK_001_small.jpg [160.26 KiB]
60-mal heruntergeladen

Autor:  Sascha Willems [ Mi Okt 20, 2004 20:41 ]
Betreff des Beitrags: 

That's the normal behaviour of blending. If you don't want it to look like that, you need to use multitexturing.

Autor:  Stucuk [ Do Okt 21, 2004 15:16 ]
Betreff des Beitrags: 

Then the question becomes how did idsoftware do it. Each shader layer seems to have to be drawn as a new face, allowing for the blend, alpha, etc to work. I have never seen these errors in RTCW so there must b some way around it.

Modifying the RenderSurfaceShader from the first lot of code to the second just causes opengl "no error" messages and alot of faces arn't drawn:

Original:
Code:
  1.  
  2. procedure TQuake3BSP.RenderSurfaceShader(faceIndex, shaderId: integer);
  3. var shader : TShader;
  4.     i, texId, planeIdx : integer;
  5.     Face : PBSPFace;
  6.     const
  7.     multi = true;
  8. begin
  9.   try
  10.   Face := @Faces[faceIndex];
  11.   shader := ShaderManager[ShaderId];
  12.  
  13.   If shader.Name = 'textures\terrain\mxterra10_0' then
  14.   begin
  15.   {$IfDef HELIOS_CONSOLE}
  16.   cons.AddIfDifferent('Aborting RenderSurfaceShader: probmatic texture <textures\terrain\mxterra10_0>');
  17.   {$EndIf}
  18.   exit;
  19.   end;
  20.  
  21.   // culling
  22.   if shader.Cull = GL_NONE then
  23.     glDisable(GL_CULL_FACE)    
  24.   else begin
  25.     glEnable(GL_CULL_FACE);
  26.     glCullFace(shader.cull);
  27.   end;
  28.  
  29.   //glDisable(GL_TEXTURE_2D);
  30.  
  31.    // prepare data for global deform operations - but texture coordinates must restored for each layer !!!!!
  32.  
  33.   { If shaderID = 30 then
  34.    ShowMessage(inttostr(face.numMeshVerts));
  35.          }
  36.    for i := 0 to face.numMeshVerts-1 do
  37.    inputBuffer[i] := Vertices[Face.startVertIndex+MeshVertices[face.meshVertIndex+i]];
  38.  
  39.  
  40.   SetVertexCoords(shaderId, face.numMeshVerts);
  41.   glVertexPointer(3, GL_FLOAT, sizeof(TBSPVertex), @inputBuffer[0].Position);
  42.  
  43.   if LockArrays then glLockArraysEXT(0, Face.numMeshVerts);
  44.  
  45.   if shader.numOfLayers > 0 then begin
  46.     for i := 0 to shader.numOfLayers-1 do begin
  47.       if (ShaderManager[shaderId].Layers[i].numOfrgbGen > 0) or (Face.FaceType = FACE_MESH) then begin
  48.         SetVertexColors(shaderId, i, face.numMeshVerts);
  49.         glColorPointer(4, GL_UNSIGNED_BYTE, 0, @colorBuffer[0]);
  50.         glEnableClientState(GL_COLOR_ARRAY);
  51.       end{
  52.       else
  53.         glColor3f(1,1,1)};
  54.  
  55.       SetTextureCoordinates(shaderId, i, face.numMeshVerts);
  56.  
  57.       glTexCoordPointer(2, GL_FLOAT, 0,  @texCoordBuffer[0]);
  58.  
  59.       if (shader.Layers[i].UseLightmap) then begin
  60.         if not CG_MultiTexture then begin
  61.           texId := 0;
  62.         end
  63.         else begin
  64.           glTexCoordPointer(2, GL_FLOAT, sizeof(TBSPVERTEX), @inputBuffer[0].LightmapCoord);
  65.           if (face.lightmapId > -1) and (Lightmaps[face.lightmapID] > -1) then
  66.             texId := Lightmaps[face.lightmapID]
  67.           else
  68.             texId := 0;
  69.         end;
  70.       end
  71.       else begin
  72.         texId := shader.Layers[i].TextureId[shader.Layers[i].curTexture];
  73.       end;
  74.       glEnable(GL_TEXTURE_2D);
  75.  
  76.       {if LastTexID <> texId then
  77.       begin}
  78.       glBindTexture(GL_TEXTURE_2D, texId);
  79.       texId := LastTexID;
  80.       {end
  81.       else
  82.       Inc(SavedBindCalls);}
  83.  
  84.  
  85.       shaderManager.SetState(shaderId, i );
  86.  
  87. //      glDisable(GL_Blend);
  88.       glDrawArrays(GL_TRIANGLES, 0, Face.numMeshVerts);
  89.  
  90.       if (ShaderManager[shaderId].Layers[i].numOfrgbGen > 0) or (Face.FaceType = FACE_MESH) then
  91.       begin
  92.       glDisableClientState(GL_COLOR_ARRAY);
  93.       glColor3f(1,1,1);
  94.       end;
  95.     end;
  96.   end;
  97.  
  98.  
  99.   if LockArrays then glUnlockArraysEXT();
  100.   SetDefaults;
  101.   if (numOfEffects > 0) and (Faces[faceIndex].effect > -1) and (not CG_SimpleRender) and (CG_Fog) then begin
  102.     if (Effects[Faces[faceIndex].effect].visibleside >= 0) then
  103.       planeIdx := BrushSides[Brushes[Effects[Faces[faceIndex].effect].brushIndex].brushside + Effects[Faces[faceIndex].effect].visibleside].plane
  104.     else
  105.       planeIdx :=  -1;
  106.  
  107.     RenderFog(faceIndex, Effects[Faces[faceIndex].effect].shaderIndex, planeIdx);
  108.     SetDefaults;
  109.     if CG_MultiTexture then begin
  110.     glActiveTexture(GL_TEXTURE1);
  111.     glDisable(GL_TEXTURE_2D);
  112.  
  113.     glActiveTexture(GL_TEXTURE0);
  114.     end;
  115.   end;
  116. //  Cons.AddIfDifferent(inttostr(shaderid));
  117. LastShader := ShaderId;
  118.   except
  119.     lastError := glGetError();
  120.     lastErrorString := gluErrorString(lastError);
  121.     {$IfDef HELIOS_CONSOLE}Cons.AddIfDifferent('RenderSurfaceShader Error: ' + lastErrorString + ' Face:' + IntToStr(faceIndex) + ' Shader: ' + shader.Name + ' ShaderID: ' + inttostr(ShaderId) + ' LastShader: ' + ShaderManager[LastShader].Name); {$EndIf}
  122.   end;
  123.  
  124. end;
  125.  


Screwed one that should do lightmaps using multitexture....
Code:
  1. procedure TQuake3BSP.RenderSurfaceShader(faceIndex, shaderId: integer);
  2. var shader : TShader;
  3.     i, texId,lmId, planeIdx : integer;
  4.     Face : PBSPFace;
  5.     const
  6.     multi = true;
  7. begin
  8.   try
  9.   Face := @Faces[faceIndex];
  10.   shader := ShaderManager[ShaderId];
  11.  
  12.   If shader.Name = 'textures\terrain\mxterra10_0' then
  13.   begin
  14.   {$IfDef HELIOS_CONSOLE}
  15.   cons.AddIfDifferent('Aborting RenderSurfaceShader: probmatic texture <textures\terrain\mxterra10_0>');
  16.   {$EndIf}
  17.   exit;
  18.   end;
  19.  
  20.   // culling
  21.   if shader.Cull = GL_NONE then
  22.     glDisable(GL_CULL_FACE)    
  23.   else begin
  24.     glEnable(GL_CULL_FACE);
  25.     glCullFace(shader.cull);
  26.   end;
  27.  
  28.   //glDisable(GL_TEXTURE_2D);
  29.  
  30.    // prepare data for global deform operations - but texture coordinates must restored for each layer !!!!!
  31.  
  32.   { If shaderID = 30 then
  33.    ShowMessage(inttostr(face.numMeshVerts));
  34.          }
  35.    for i := 0 to face.numMeshVerts-1 do
  36.    inputBuffer[i] := Vertices[Face.startVertIndex+MeshVertices[face.meshVertIndex+i]];
  37.  
  38.  
  39.   SetVertexCoords(shaderId, face.numMeshVerts);
  40.   glVertexPointer(3, GL_FLOAT, sizeof(TBSPVertex), @inputBuffer[0].Position);
  41.  
  42.   if LockArrays then glLockArraysEXT(0, Face.numMeshVerts);
  43.  
  44.   if shader.numOfLayers > 0 then begin
  45.     for i := 0 to shader.numOfLayers-1 do begin
  46.       if (ShaderManager[shaderId].Layers[i].numOfrgbGen > 0) or (Face.FaceType = FACE_MESH) then begin
  47.         SetVertexColors(shaderId, i, face.numMeshVerts);
  48.         glColorPointer(4, GL_UNSIGNED_BYTE, 0, @colorBuffer[0]);
  49.         glEnableClientState(GL_COLOR_ARRAY);
  50.       end{
  51.       else
  52.         glColor3f(1,1,1)};
  53.  
  54.       SetTextureCoordinates(shaderId, i, face.numMeshVerts);
  55.  
  56.       if (shader.Layers[i].UseLightmap) then begin
  57.         if not CG_MultiTexture then begin
  58.           lmId := 0;
  59.         end
  60.         else
  61.         if (face.lightmapId > -1) and (Lightmaps[face.lightmapID] > -1) then
  62.         begin
  63.           glActiveTexture(GL_TEXTURE1);
  64.           glTexCoordPointer(2, GL_FLOAT, sizeof(TBSPVERTEX), @inputBuffer[0].LightmapCoord);
  65.           glActiveTexture(GL_TEXTURE0);
  66.           lmId := Lightmaps[face.lightmapID]
  67.         end
  68.         else
  69.           lmId := 0;
  70.       end;{
  71.       else begin}
  72.         texId := shader.Layers[i].TextureId[shader.Layers[i].curTexture];
  73. //      end;
  74.  
  75.       glActiveTexture(GL_TEXTURE0);
  76.       glTexCoordPointer(2, GL_FLOAT, 0,  @texCoordBuffer[0]);
  77.  
  78. //      glEnable(GL_TEXTURE_2D);
  79.  
  80.       {if LastTexID <> texId then
  81.       begin}
  82.   //    glBindTexture(GL_TEXTURE_2D, texId);
  83.       glActiveTexture(GL_TEXTURE1);
  84.       if lmId > 0 then begin
  85.         glEnable(GL_TEXTURE_2D);
  86.         glBindTexture(GL_TEXTURE_2D, Lightmaps[lmId]);
  87.       end
  88.       else begin
  89.         glDisable(GL_TEXTURE_2D);
  90.       end;
  91.  
  92.  
  93.  
  94.  
  95.       glActiveTexture(GL_TEXTURE0);
  96.       //glEnable(GL_TEXTURE_2D);
  97.       glBindTexture(GL_TEXTURE_2D, texId);
  98.       texId := LastTexID;
  99.       {end
  100.       else
  101.       Inc(SavedBindCalls);}
  102.  
  103.  
  104.       shaderManager.SetState(shaderId, i );
  105.  
  106. //      glDisable(GL_Blend);
  107.       glDrawArrays(GL_TRIANGLES, 0, Face.numMeshVerts);
  108.  
  109.       if (ShaderManager[shaderId].Layers[i].numOfrgbGen > 0) or (Face.FaceType = FACE_MESH) then
  110.       begin
  111.       glDisableClientState(GL_COLOR_ARRAY);
  112.       glColor3f(1,1,1);
  113.       end;
  114.     end;
  115.   end;
  116.  
  117.  
  118.   if LockArrays then glUnlockArraysEXT();
  119.   SetDefaults;
  120.   if (numOfEffects > 0) and (Faces[faceIndex].effect > -1) and (not CG_SimpleRender) and (CG_Fog) then begin
  121.     if (Effects[Faces[faceIndex].effect].visibleside >= 0) then
  122.       planeIdx := BrushSides[Brushes[Effects[Faces[faceIndex].effect].brushIndex].brushside + Effects[Faces[faceIndex].effect].visibleside].plane
  123.     else
  124.       planeIdx :=  -1;
  125.  
  126.     RenderFog(faceIndex, Effects[Faces[faceIndex].effect].shaderIndex, planeIdx);
  127.     SetDefaults;
  128.     if CG_MultiTexture then begin
  129.     glActiveTexture(GL_TEXTURE1);
  130.     glDisable(GL_TEXTURE_2D);
  131.  
  132.     glActiveTexture(GL_TEXTURE0);
  133.     end;
  134.   end;
  135. //  Cons.AddIfDifferent(inttostr(shaderid));
  136. LastShader := ShaderId;
  137.   except
  138.     lastError := glGetError();
  139.     lastErrorString := gluErrorString(lastError);
  140.     {$IfDef HELIOS_CONSOLE}Cons.AddIfDifferent('RenderSurfaceShader Error: ' + lastErrorString + ' Face:' + IntToStr(faceIndex) + ' Shader: ' + shader.Name + ' ShaderID: ' + inttostr(ShaderId) + ' LastShader: ' + ShaderManager[LastShader].Name); {$EndIf}
  141.   end;
  142.  
  143. end;
  144.  

Autor:  Sascha Willems [ Fr Okt 22, 2004 15:07 ]
Betreff des Beitrags: 

If I'm not mistaken, J.C. never used normal OpenGL-Fog for his Q3 engine and that's why you won't see those errors in Q3 based games. He used radial fog (via extensions I guess) in RtCW and in Q3 he rendered fog with volumes rather than using the gl-fog.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/