Permalänk
Medlem

[C++] SDL Lightning Effects?

Hej,
sitter och leker lite med SDL och har läst runt lite och vad jag fattar så har det inget stöd för shaders etc.
Så finns det någon vettig lösning som inte drar extrema CPU-krafter för att få lightning effects i spel?

Exempel vad jag letar lösning på är att ha mörker i hela synfältet utom där spelaren är, där vill jag ha en sk lampa som lyser frammåt från gubben. Men jag har ingen aning om hur jag ska gå till väga med ljushantering, har bra koll över SDL och C++ så jag nöjer mig med en någorlunda bra förklaring om hur man skulle kunna göra.

Tack på förhand.

//AJL

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Medlem

Shaders fungerar tilsammans med sdl, dock får du köra det mot opengl och inte sdl, vet inte om det kräver glut, glew har ju funktioner för att detektera shadergrejer.

här är en initfunktion för att ladda en shader som jag använder i examensarbetet, sedan kan du nog söka och använda detta som nyckelord.

bool InitShader(struct ShaderObject* so,const GLchar* vertShaderSrc[], const GLchar* fragShaderSrc[]) { GLint compiled, linked; so->vertShaderID = glCreateShader(GL_VERTEX_SHADER); glShaderSource(so->vertShaderID, 1, vertShaderSrc, NULL); glCompileShader(so->vertShaderID); glGetShaderiv(so->vertShaderID, GL_COMPILE_STATUS, &compiled); if (!compiled) { printf("Compile Error Vertex Shader!\n"); return false;} //fragment shader so->fragShaderID = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(so->fragShaderID, 1, fragShaderSrc, NULL); glCompileShader(so->fragShaderID); glGetShaderiv(so->fragShaderID, GL_COMPILE_STATUS, &compiled); //linking if (!compiled) { printf("Compile Error Fragment Shader!\n"); return false;} so->shaderProgramID = glCreateProgram(); glAttachShader(so->shaderProgramID, so->vertShaderID); glAttachShader(so->shaderProgramID, so->fragShaderID); glLinkProgram (so->shaderProgramID); glGetProgramiv(so->shaderProgramID, GL_LINK_STATUS, &linked); if (!linked) { printf("Link Error Shader Program!\n"); return false;} return true; }

Edit: ser att jag har #include <GL/glew.h> samt #include <glut.h> så förmodligen behöver du dessa länkade till ditt projekt för att få åtkomst till allt.

Permalänk
Medlem
Skrivet av AJL:

Exempel vad jag letar lösning på är att ha mörker i hela synfältet utom där spelaren är, där vill jag ha en sk lampa som lyser frammåt från gubben.

Behövs inga shaders för det? Blitta en stor svart bitmap med ett alpha-hål över din surface innan du "vänder" den, bara.

Permalänk
Medlem
Skrivet av You:

Behövs inga shaders för det? Blitta en stor svart bitmap med ett alpha-hål över din surface innan du "vänder" den, bara.

Frågan är hur effektivt det skulle bli, skulle han då blitta på en kon eller vad det nu är för ficklampans riktning (eller kanske en rund?) som har en färg som är transparent för den svarta texturen? Sedan blitta resultatet ovanpå scenen mha 2d transformeringar? Dubbelt med bufferminne samt förändring på alla pixlar på scenen, transparenta grejer brukar inte vara de snabbaste... Sedan bör det bli en ganska taskig effekt av en ficklampa då den inte tar hänsyn till djupet (om det är 3d).

Shaders kan ju vara snyggt till annat också. Algoritm för att göra effekten genom shaders är inget jag har i huvudet, eller hur krävande det blir.

Edit: Du får gärna nämna om det är 2d eller 3d

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Frågan är hur effektivt det skulle bli, skulle han då blitta på en kon eller vad det nu är för ficklampans riktning (eller kanske en rund?) som har en färg som är transparent för den svarta texturen? Sedan blitta resultatet ovanpå scenen mha 2d transformeringar? Dubbelt med bufferminne samt förändring på alla pixlar på scenen, transparenta grejer brukar inte vara de snabbaste... Sedan bör det bli en ganska taskig effekt av en ficklampa då den inte tar hänsyn till djupet (om det är 3d).

Shaders kan ju vara snyggt till annat också. Algoritm för att göra effekten genom shaders är inget jag har i huvudet, eller hur krävande det blir.

Edit: Du får gärna nämna om det är 2d eller 3d

Euhm, tänkte inte igenom det där. Lämpligare är kanske att blitta hela scenen (eller kanske bara delar av den) på en surface, och sedan blitta den på skärmen med en fin alpha-mask, medans man täcker resten med svart. Behöver inte vara så processorintentsivt egentligen. Förutsatte dessutom att det var 2d, det blir givetvis inte lika enkelt/bra i 3d.

Permalänk
Medlem

Kan tillägga att det gäller 2D i dethär fallet

You's senaste lösning borde fungera bra i teorin tror jag, har inte provat ännu.

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Medlem
Skrivet av AJL:

Kan tillägga att det gäller 2D i dethär fallet

You's senaste lösning borde fungera bra i teorin tror jag, har inte provat ännu.

Yes, då kan det vara värt att testa