Multisampling in gles canvas shader
This commit is contained in:
		
							parent
							
								
									f73241e4a6
								
							
						
					
					
						commit
						28e2a3648e
					
				|  | @ -71,19 +71,19 @@ int main() | ||||||
| 					{ | 					{ | ||||||
| 						if(event.key.code == MP_KEY_LEFT) | 						if(event.key.code == MP_KEY_LEFT) | ||||||
| 						{ | 						{ | ||||||
| 							dx-=1.1; | 							dx-=5.1; | ||||||
| 						} | 						} | ||||||
| 						else if(event.key.code == MP_KEY_RIGHT) | 						else if(event.key.code == MP_KEY_RIGHT) | ||||||
| 						{ | 						{ | ||||||
| 							dx+=1.1; | 							dx+=5.1; | ||||||
| 						} | 						} | ||||||
| 						else if(event.key.code == MP_KEY_UP) | 						else if(event.key.code == MP_KEY_UP) | ||||||
| 						{ | 						{ | ||||||
| 							dy+=1.1; | 							dy+=5.1; | ||||||
| 						} | 						} | ||||||
| 						else if(event.key.code == MP_KEY_DOWN) | 						else if(event.key.code == MP_KEY_DOWN) | ||||||
| 						{ | 						{ | ||||||
| 							dy-=1.1; | 							dy-=5.1; | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 				} break; | 				} break; | ||||||
|  |  | ||||||
|  | @ -51,22 +51,37 @@ const char* gles_canvas_fragment = | ||||||
| "\n" | "\n" | ||||||
| "void main()\n" | "void main()\n" | ||||||
| "{\n" | "{\n" | ||||||
| "	float subPixelFactor = 16.;\n" | "	const float subPixelFactor = 16.;\n" | ||||||
|  | "	const int sampleCount = 8;\n" | ||||||
| "\n" | "\n" | ||||||
| "    vec4 pixelColor = clearColor;\n" | "	ivec2 centerPoint = ivec2(round(gl_FragCoord.xy * subPixelFactor));\n" | ||||||
| "    vec4 currentColor = clearColor;\n" | "	ivec2 samplePoints[sampleCount] = ivec2[sampleCount](centerPoint + ivec2(1, 3),\n" | ||||||
|  | "	                                                     centerPoint + ivec2(-1, -3),\n" | ||||||
|  | "	                                                     centerPoint + ivec2(5, -1),\n" | ||||||
|  | "	                                                     centerPoint + ivec2(-3, 5),\n" | ||||||
|  | "	                                                     centerPoint + ivec2(-5, -5),\n" | ||||||
|  | "	                                                     centerPoint + ivec2(-7, 1),\n" | ||||||
|  | "	                                                     centerPoint + ivec2(3, -7),\n" | ||||||
|  | "	                                                     centerPoint + ivec2(7, 7));\n" | ||||||
| "\n" | "\n" | ||||||
| "	ivec2 samplePoint = ivec2(gl_FragCoord.xy * subPixelFactor + vec2(0.5, 0.5));\n" | "	vec4 sampleColor[sampleCount];\n" | ||||||
|  | "	vec4 currentColor[sampleCount];\n" | ||||||
|  | "    int currentZIndex[sampleCount];\n" | ||||||
|  | "    int flipCount[sampleCount];\n" | ||||||
| "\n" | "\n" | ||||||
| "    int currentZIndex = -1;\n" | "    for(int i=0; i<sampleCount; i++)\n" | ||||||
| "    int flipCount = 0;\n" |  | ||||||
| "\n" |  | ||||||
| "\n" |  | ||||||
| "    for(int i=0; i<indexCount; i+=3)\n" |  | ||||||
| "    {\n" | "    {\n" | ||||||
| "		uint i0 = indexBuffer.elements[i];\n" | "		currentZIndex[i] = -1;\n" | ||||||
| "		uint i1 = indexBuffer.elements[i+1];\n" | "		flipCount[i] = 0;\n" | ||||||
| "		uint i2 = indexBuffer.elements[i+2];\n" | "		sampleColor[i] = clearColor;\n" | ||||||
|  | "		currentColor[i] = clearColor;\n" | ||||||
|  | "    }\n" | ||||||
|  | "\n" | ||||||
|  | "    for(int triangleIndex=0; triangleIndex<indexCount; triangleIndex+=3)\n" | ||||||
|  | "    {\n" | ||||||
|  | "		uint i0 = indexBuffer.elements[triangleIndex];\n" | ||||||
|  | "		uint i1 = indexBuffer.elements[triangleIndex+1];\n" | ||||||
|  | "		uint i2 = indexBuffer.elements[triangleIndex+2];\n" | ||||||
| "\n" | "\n" | ||||||
| "		ivec2 p0 = ivec2(vertexBuffer.elements[i0].pos * subPixelFactor + vec2(0.5, 0.5));\n" | "		ivec2 p0 = ivec2(vertexBuffer.elements[i0].pos * subPixelFactor + vec2(0.5, 0.5));\n" | ||||||
| "		ivec2 p1 = ivec2(vertexBuffer.elements[i1].pos * subPixelFactor + vec2(0.5, 0.5));\n" | "		ivec2 p1 = ivec2(vertexBuffer.elements[i1].pos * subPixelFactor + vec2(0.5, 0.5));\n" | ||||||
|  | @ -96,40 +111,49 @@ const char* gles_canvas_fragment = | ||||||
| "		int bias1 = is_top_left(p2, p0) ? 0 : -1;\n" | "		int bias1 = is_top_left(p2, p0) ? 0 : -1;\n" | ||||||
| "		int bias2 = is_top_left(p0, p1) ? 0 : -1;\n" | "		int bias2 = is_top_left(p0, p1) ? 0 : -1;\n" | ||||||
| "\n" | "\n" | ||||||
| "		int w0 = orient2d(p1, p2, samplePoint);\n" | "		for(int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)\n" | ||||||
| "		int w1 = orient2d(p2, p0, samplePoint);\n" |  | ||||||
| "		int w2 = orient2d(p0, p1, samplePoint);\n" |  | ||||||
| "\n" |  | ||||||
| "		if((w0+bias0) >= 0 && (w1+bias1) >= 0 && (w2+bias2) >= 0)\n" |  | ||||||
| "		{\n" | "		{\n" | ||||||
| "			vec4 cubic = (cubic0*float(w0) + cubic1*float(w1) + cubic2*float(w2))/(float(w0)+float(w1)+float(w2));\n" | "			ivec2 samplePoint = samplePoints[sampleIndex];\n" | ||||||
| "\n" | "\n" | ||||||
| "			float eps = 0.0001;\n" | "			int w0 = orient2d(p1, p2, samplePoint);\n" | ||||||
| "			if(cubic.w*(cubic.x*cubic.x*cubic.x - cubic.y*cubic.z) <= eps)\n" | "			int w1 = orient2d(p2, p0, samplePoint);\n" | ||||||
|  | "			int w2 = orient2d(p0, p1, samplePoint);\n" | ||||||
|  | "\n" | ||||||
|  | "			if((w0+bias0) >= 0 && (w1+bias1) >= 0 && (w2+bias2) >= 0)\n" | ||||||
| "			{\n" | "			{\n" | ||||||
| "				if(zIndex == currentZIndex)\n" | "				vec4 cubic = (cubic0*float(w0) + cubic1*float(w1) + cubic2*float(w2))/(float(w0)+float(w1)+float(w2));\n" | ||||||
|  | "\n" | ||||||
|  | "				float eps = 0.0001;\n" | ||||||
|  | "				if(cubic.w*(cubic.x*cubic.x*cubic.x - cubic.y*cubic.z) <= eps)\n" | ||||||
| "				{\n" | "				{\n" | ||||||
| "					flipCount++;\n" | "					if(zIndex == currentZIndex[sampleIndex])\n" | ||||||
| "				}\n" |  | ||||||
| "				else\n" |  | ||||||
| "				{\n" |  | ||||||
| "					if((flipCount & 0x01) != 0)\n" |  | ||||||
| "					{\n" | "					{\n" | ||||||
| "						pixelColor = currentColor;\n" | "						flipCount[sampleIndex]++;\n" | ||||||
|  | "					}\n" | ||||||
|  | "					else\n" | ||||||
|  | "					{\n" | ||||||
|  | "						if((flipCount[sampleIndex] & 0x01) != 0)\n" | ||||||
|  | "						{\n" | ||||||
|  | "							sampleColor[sampleIndex] = currentColor[sampleIndex];\n" | ||||||
|  | "						}\n" | ||||||
|  | "						currentColor[sampleIndex] = sampleColor[sampleIndex]*(1.-color.a) + color.a*color;\n" | ||||||
|  | "						currentZIndex[sampleIndex] = zIndex;\n" | ||||||
|  | "						flipCount[sampleIndex] = 1;\n" | ||||||
| "					}\n" | "					}\n" | ||||||
| "					currentColor = pixelColor*(1.-color.a) + color.a*color;\n" |  | ||||||
| "					currentZIndex = zIndex;\n" |  | ||||||
| "					flipCount = 1;\n" |  | ||||||
| "				}\n" | "				}\n" | ||||||
| "			}\n" | "			}\n" | ||||||
| "		}\n" | "		}\n" | ||||||
| "    }\n" | "    }\n" | ||||||
| "    if((flipCount & 0x01) != 0)\n" | "    vec4 pixelColor = vec4(0);\n" | ||||||
|  | "    for(int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)\n" | ||||||
| "    {\n" | "    {\n" | ||||||
| "		pixelColor = currentColor;\n" | "    	if((flipCount[sampleIndex] & 0x01) != 0)\n" | ||||||
| "    }\n" | "    	{\n" | ||||||
| "\n" | "			sampleColor[sampleIndex] = currentColor[sampleIndex];\n" | ||||||
| "    fragColor = pixelColor;\n" | "    	}\n" | ||||||
|  | "    	pixelColor += sampleColor[sampleIndex];\n" | ||||||
|  | "	}\n" | ||||||
|  | "    fragColor = pixelColor/float(sampleCount);\n" | ||||||
| "}\n"; | "}\n"; | ||||||
| 
 | 
 | ||||||
| //NOTE: string imported from src\gles_canvas_shaders\gles_canvas_vertex.glsl
 | //NOTE: string imported from src\gles_canvas_shaders\gles_canvas_vertex.glsl
 | ||||||
|  |  | ||||||
|  | @ -38,22 +38,37 @@ int orient2d(ivec2 a, ivec2 b, ivec2 p) | ||||||
| 
 | 
 | ||||||
| void main() | void main() | ||||||
| { | { | ||||||
| 	float subPixelFactor = 16.; | 	const float subPixelFactor = 16.; | ||||||
|  | 	const int sampleCount = 8; | ||||||
| 
 | 
 | ||||||
|     vec4 pixelColor = clearColor; | 	ivec2 centerPoint = ivec2(round(gl_FragCoord.xy * subPixelFactor)); | ||||||
|     vec4 currentColor = clearColor; | 	ivec2 samplePoints[sampleCount] = ivec2[sampleCount](centerPoint + ivec2(1, 3), | ||||||
|  | 	                                                     centerPoint + ivec2(-1, -3), | ||||||
|  | 	                                                     centerPoint + ivec2(5, -1), | ||||||
|  | 	                                                     centerPoint + ivec2(-3, 5), | ||||||
|  | 	                                                     centerPoint + ivec2(-5, -5), | ||||||
|  | 	                                                     centerPoint + ivec2(-7, 1), | ||||||
|  | 	                                                     centerPoint + ivec2(3, -7), | ||||||
|  | 	                                                     centerPoint + ivec2(7, 7)); | ||||||
| 
 | 
 | ||||||
| 	ivec2 samplePoint = ivec2(gl_FragCoord.xy * subPixelFactor + vec2(0.5, 0.5)); | 	vec4 sampleColor[sampleCount]; | ||||||
|  | 	vec4 currentColor[sampleCount]; | ||||||
|  |     int currentZIndex[sampleCount]; | ||||||
|  |     int flipCount[sampleCount]; | ||||||
| 
 | 
 | ||||||
|     int currentZIndex = -1; |     for(int i=0; i<sampleCount; i++) | ||||||
|     int flipCount = 0; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     for(int i=0; i<indexCount; i+=3) |  | ||||||
|     { |     { | ||||||
| 		uint i0 = indexBuffer.elements[i]; | 		currentZIndex[i] = -1; | ||||||
| 		uint i1 = indexBuffer.elements[i+1]; | 		flipCount[i] = 0; | ||||||
| 		uint i2 = indexBuffer.elements[i+2]; | 		sampleColor[i] = clearColor; | ||||||
|  | 		currentColor[i] = clearColor; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for(int triangleIndex=0; triangleIndex<indexCount; triangleIndex+=3) | ||||||
|  |     { | ||||||
|  | 		uint i0 = indexBuffer.elements[triangleIndex]; | ||||||
|  | 		uint i1 = indexBuffer.elements[triangleIndex+1]; | ||||||
|  | 		uint i2 = indexBuffer.elements[triangleIndex+2]; | ||||||
| 
 | 
 | ||||||
| 		ivec2 p0 = ivec2(vertexBuffer.elements[i0].pos * subPixelFactor + vec2(0.5, 0.5)); | 		ivec2 p0 = ivec2(vertexBuffer.elements[i0].pos * subPixelFactor + vec2(0.5, 0.5)); | ||||||
| 		ivec2 p1 = ivec2(vertexBuffer.elements[i1].pos * subPixelFactor + vec2(0.5, 0.5)); | 		ivec2 p1 = ivec2(vertexBuffer.elements[i1].pos * subPixelFactor + vec2(0.5, 0.5)); | ||||||
|  | @ -83,38 +98,47 @@ void main() | ||||||
| 		int bias1 = is_top_left(p2, p0) ? 0 : -1; | 		int bias1 = is_top_left(p2, p0) ? 0 : -1; | ||||||
| 		int bias2 = is_top_left(p0, p1) ? 0 : -1; | 		int bias2 = is_top_left(p0, p1) ? 0 : -1; | ||||||
| 
 | 
 | ||||||
| 		int w0 = orient2d(p1, p2, samplePoint); | 		for(int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++) | ||||||
| 		int w1 = orient2d(p2, p0, samplePoint); |  | ||||||
| 		int w2 = orient2d(p0, p1, samplePoint); |  | ||||||
| 
 |  | ||||||
| 		if((w0+bias0) >= 0 && (w1+bias1) >= 0 && (w2+bias2) >= 0) |  | ||||||
| 		{ | 		{ | ||||||
| 			vec4 cubic = (cubic0*float(w0) + cubic1*float(w1) + cubic2*float(w2))/(float(w0)+float(w1)+float(w2)); | 			ivec2 samplePoint = samplePoints[sampleIndex]; | ||||||
| 
 | 
 | ||||||
| 			float eps = 0.0001; | 			int w0 = orient2d(p1, p2, samplePoint); | ||||||
| 			if(cubic.w*(cubic.x*cubic.x*cubic.x - cubic.y*cubic.z) <= eps) | 			int w1 = orient2d(p2, p0, samplePoint); | ||||||
|  | 			int w2 = orient2d(p0, p1, samplePoint); | ||||||
|  | 
 | ||||||
|  | 			if((w0+bias0) >= 0 && (w1+bias1) >= 0 && (w2+bias2) >= 0) | ||||||
| 			{ | 			{ | ||||||
| 				if(zIndex == currentZIndex) | 				vec4 cubic = (cubic0*float(w0) + cubic1*float(w1) + cubic2*float(w2))/(float(w0)+float(w1)+float(w2)); | ||||||
|  | 
 | ||||||
|  | 				float eps = 0.0001; | ||||||
|  | 				if(cubic.w*(cubic.x*cubic.x*cubic.x - cubic.y*cubic.z) <= eps) | ||||||
| 				{ | 				{ | ||||||
| 					flipCount++; | 					if(zIndex == currentZIndex[sampleIndex]) | ||||||
| 				} |  | ||||||
| 				else |  | ||||||
| 				{ |  | ||||||
| 					if((flipCount & 0x01) != 0) |  | ||||||
| 					{ | 					{ | ||||||
| 						pixelColor = currentColor; | 						flipCount[sampleIndex]++; | ||||||
|  | 					} | ||||||
|  | 					else | ||||||
|  | 					{ | ||||||
|  | 						if((flipCount[sampleIndex] & 0x01) != 0) | ||||||
|  | 						{ | ||||||
|  | 							sampleColor[sampleIndex] = currentColor[sampleIndex]; | ||||||
|  | 						} | ||||||
|  | 						currentColor[sampleIndex] = sampleColor[sampleIndex]*(1.-color.a) + color.a*color; | ||||||
|  | 						currentZIndex[sampleIndex] = zIndex; | ||||||
|  | 						flipCount[sampleIndex] = 1; | ||||||
| 					} | 					} | ||||||
| 					currentColor = pixelColor*(1.-color.a) + color.a*color; |  | ||||||
| 					currentZIndex = zIndex; |  | ||||||
| 					flipCount = 1; |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|     } |     } | ||||||
|     if((flipCount & 0x01) != 0) |     vec4 pixelColor = vec4(0); | ||||||
|  |     for(int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++) | ||||||
|     { |     { | ||||||
| 		pixelColor = currentColor; |     	if((flipCount[sampleIndex] & 0x01) != 0) | ||||||
|     } |     	{ | ||||||
| 
 | 			sampleColor[sampleIndex] = currentColor[sampleIndex]; | ||||||
|     fragColor = pixelColor; |     	} | ||||||
|  |     	pixelColor += sampleColor[sampleIndex]; | ||||||
|  | 	} | ||||||
|  |     fragColor = pixelColor/float(sampleCount); | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								todo.txt
								
								
								
								
							
							
						
						
									
										20
									
								
								todo.txt
								
								
								
								
							|  | @ -22,17 +22,27 @@ | ||||||
| 		-> convert verts pos to fixed point | 		-> convert verts pos to fixed point | ||||||
| 		-> do orient2d in fixed point | 		-> do orient2d in fixed point | ||||||
| 	[!] Check precision/possible overflow when using barycentric coords | 	[!] Check precision/possible overflow when using barycentric coords | ||||||
| 	[!] Avoid first useless (degenerate) triangle on every path | 
 | ||||||
| 	[x] Set backround clear color | 	[x] Set backround clear color | ||||||
| 	[ ] Multi-sampling | 	[x] Multi-sampling | ||||||
| 	[ ] Assess perf | 	[!] Avoid first useless (degenerate) triangle on every path | ||||||
|  | 
 | ||||||
|  | 	[ ] image rendering | ||||||
|  | 		[ ] Re-think image API first?? | ||||||
|  | 		[ ] gles image atlas logic | ||||||
|  | 		[ ] textured rendering in shader | ||||||
|  | 
 | ||||||
|  | 	[ ] Image rendering test app | ||||||
|  | 	[ ] Text rendering test app | ||||||
|  | 	[?] Little test drawing app? | ||||||
|  | 
 | ||||||
|  | 	[>] Assess perf | ||||||
| 		[ ] Tiling | 		[ ] Tiling | ||||||
| 		[ ] Precomputing triangle edges/biases? | 		[ ] Precomputing triangle edges/biases? | ||||||
| 
 | 
 | ||||||
| 	[ ] Little test drawing app |  | ||||||
| 
 |  | ||||||
| [ ] Implement surfaces with child windows on win32 | [ ] Implement surfaces with child windows on win32 | ||||||
| 	[/] Maybe implement compositing directly in d3d and opengl compat extension... | 	[/] Maybe implement compositing directly in d3d and opengl compat extension... | ||||||
|  | [ ] Cleanup routines | ||||||
| 
 | 
 | ||||||
| Windows port | Windows port | ||||||
| ------------ | ------------ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue