Shader für ältere Hardware umschreiben



  • Hallo zusammen,

    ich habe ein Apfelmännchen Programm geschrieben, das hautpsächlich auf dem fragment shader läuft.
    Allerdings läuft es nur auf sehr sehr neuen Grafikkarten, deswegen möchte ich jetzt alles, was zu neue ist durch etwas ältere Sachen ersetzen.
    Zunächst wäre es erstmal gut zu wissen, was davon am ehesten Probleme bereitet.
    Hier sind mal die shader (in GLSL geschrieben):

    std::string const Scene::vertexShader =
    	"	#version 330							\n"
    	"	layout(location = 0) in vec4 position;	\n"
    	"   layout(location = 1) in vec4 windowSize; \n"
    	"	layout(location = 2) in float scale;	\n"
    	"   out vec4 theWindowSize;					\n"
    	"	out float theScale;						\n"
    	"	void main()								\n"
    	"	{										\n"
    	"		gl_Position = position;				\n"
    	"		theWindowSize = windowSize;			\n"
    	"		theScale = scale;					\n"
    	"	}										\n";
    
    std::string const Scene::fragmentShader = 
    	"	#version 330												\n"
    	"	in vec4 theWindowSize;										\n"
    	"	in float theScale;											\n"
    	"	out vec4 outputColor;										\n"
    	"	void main()													\n"
    	"	{															\n"
    	"		float xMid = theWindowSize[0];							\n"
    	"		float yMid = theWindowSize[1];							\n"
    	"		float xOffs = theWindowSize[2] /200.f;					\n"
    	"		float yOffs = theWindowSize[3] /200.f;					\n"
    	"		float xDiff = gl_FragCoord.x - xMid;					\n"
    	"		float yDiff = gl_FragCoord.y - yMid;					\n"
    	"		float x = xDiff  * theScale /200.f + xOffs;				\n"
    	"		float y = yDiff	 * theScale /200.f + yOffs;				\n"
    	"		float xn = 0, yn = 0;									\n"
    	"       int i = 0;												\n"
    	"		int runs = 3000;										\n"
    	"		for(i = 0; i < runs; ++i)								\n"
    	"		{														\n"
    	"			float xn2 = xn * xn - yn * yn + x;					\n"
    	"			float yn2 = 2 * xn * yn + y;						\n"
    	"			xn = xn2;											\n"
    	"			yn = yn2;											\n"
    	"			if(xn * xn + yn * yn > 4)							\n"
    	"				break;											\n"
    	"		}														\n"
    	"		float f = i;											\n"
    	"		f /= runs;												\n"
    	"		f = pow(f, 0.2f);										\n"
        "		outputColor =											\n"
    	"			mix(												\n"
    	"				vec4(1.0f, 1.0f, 1.0f, 1.0f),					\n"
    	"				vec4(0.0f, 0.0f, 1.0f, 1.0f),					\n"
    	"				f);												\n"
    	"	}															\n";
    

    Und ich benutze VBOs, aber ich denke, dass das kein Problem ist, also ich wills nicht auf uralthardware zum laufen bringen, aber auf meinem laptop solltes schon laufen (da läuft auch starcraft 2 z.B.).

    Edit: Ich weiß, dass das so im moment vermutlich nicht optimal ist, weil sachen wie windowSize nicht uniform sind, das wollte ich dabei dann auch direkt noch überarbeite. Als ich das geschrieben hatte kannte ich sowas wie uniforms noch nicht.


Anmelden zum Antworten