mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Use a clear texture instead of texture 0 (solid black) in the GL rasterizer (#4844)
* Add OpenGLState.default_texture and set it to Clear in OpenGLRasterizer * Localize the fix to the GL rasterizer * Revert unwanted change
This commit is contained in:
		
							parent
							
								
									d80edd99d7
								
							
						
					
					
						commit
						e3cefe5a5d
					
				
					 2 changed files with 17 additions and 2 deletions
				
			
		|  | @ -66,6 +66,14 @@ RasterizerOpenGL::RasterizerOpenGL(Frontend::EmuWindow& window) | ||||||
|     // Clipping plane 0 is always enabled for PICA fixed clip plane z <= 0
 |     // Clipping plane 0 is always enabled for PICA fixed clip plane z <= 0
 | ||||||
|     state.clip_distance[0] = true; |     state.clip_distance[0] = true; | ||||||
| 
 | 
 | ||||||
|  |     // Create a 1x1 clear texture to use in the NULL case,
 | ||||||
|  |     // instead of OpenGL's default of solid black
 | ||||||
|  |     glGenTextures(1, &default_texture); | ||||||
|  |     glBindTexture(GL_TEXTURE_2D, default_texture); | ||||||
|  |     // For some reason alpha 0 wraps around to 1.0, so use 1/255 instead
 | ||||||
|  |     u8 framebuffer_data[4] = {0, 0, 0, 1}; | ||||||
|  |     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, framebuffer_data); | ||||||
|  | 
 | ||||||
|     // Create sampler objects
 |     // Create sampler objects
 | ||||||
|     for (std::size_t i = 0; i < texture_samplers.size(); ++i) { |     for (std::size_t i = 0; i < texture_samplers.size(); ++i) { | ||||||
|         texture_samplers[i].Create(); |         texture_samplers[i].Create(); | ||||||
|  | @ -756,10 +764,16 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) { | ||||||
|                                  surface->texture.handle); |                                  surface->texture.handle); | ||||||
|             } else { |             } else { | ||||||
|                 // Can occur when texture addr is null or its memory is unmapped/invalid
 |                 // Can occur when texture addr is null or its memory is unmapped/invalid
 | ||||||
|                 state.texture_units[texture_index].texture_2d = 0; |                 // HACK: In this case, the correct behaviour for the PICA is to use the last
 | ||||||
|  |                 // rendered colour. But because this would be impractical to implement, the
 | ||||||
|  |                 // next best alternative is to use a clear texture, essentially skipping
 | ||||||
|  |                 // the geometry in question.
 | ||||||
|  |                 // For example: a bug in Pokemon X/Y causes NULL-texture squares to be drawn
 | ||||||
|  |                 // on the male character's face, which in the OpenGL default appear black.
 | ||||||
|  |                 state.texture_units[texture_index].texture_2d = default_texture; | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             state.texture_units[texture_index].texture_2d = 0; |             state.texture_units[texture_index].texture_2d = default_texture; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -261,6 +261,7 @@ private: | ||||||
|     bool is_amd; |     bool is_amd; | ||||||
| 
 | 
 | ||||||
|     OpenGLState state; |     OpenGLState state; | ||||||
|  |     GLuint default_texture; | ||||||
| 
 | 
 | ||||||
|     RasterizerCacheOpenGL res_cache; |     RasterizerCacheOpenGL res_cache; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue