Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 07:21

Foren-Übersicht » English » English Programming Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fog and GL_Blend
BeitragVerfasst: Mi Okt 20, 2004 02:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 21, 2004 22:39
Beiträge: 360
Wohnort: UK, Scotland
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

_________________
Free Map Editor - Game Requirements - Stucuk.Net
-Stu
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 20, 2004 20:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
That's the normal behaviour of blending. If you don't want it to look like that, you need to use multitexturing.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 21, 2004 15:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 21, 2004 22:39
Beiträge: 360
Wohnort: UK, Scotland
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.  

_________________
Free Map Editor - Game Requirements - Stucuk.Net
-Stu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 22, 2004 15:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » English » English Programming Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 17 Queries | GZIP : On ]