OpenGL GLSL - Diffuse Light - Światło Rozproszone

OpenGL GLSL - Diffuse Light - Światło Rozproszone
tBane
  • Rejestracja:prawie 2 lata
  • Ostatnio:9 minut
  • Lokalizacja:Poznań
  • Postów:319
1

Witam. Próbuję napisać shader ze światłem rozproszonym. Mam poprawnie wygenerowane normalne. Ta żółta Kula powinna generować światło. Nie wiem w jaki sposób obliczyć Diffuse Light. Pomoże ktoś?

screenshot-20250309164157.png

Vertex Shader

Kopiuj
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
layout (location = 2) in vec3 aNormal;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

out vec2 TexCoord;
out vec3 Normal;
out vec3 FragPosition;

void main()
{
    TexCoord = aTexCoord;
    FragPosition = vec3(view * model * vec4(aPos, 1.0)); // Transformacja pozycji wierzchołka do przestrzeni świata
    Normal = mat3(transpose(inverse(model))) * aNormal; // Transformacja normalnych do przestrzeni świata
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}

Fragment Shader

Kopiuj
#version 330 core

in vec2 TexCoord;
in vec3 Normal;
in vec3 FragPosition;

uniform sampler2D texture1;

uniform vec3 LightPosition;

out vec4 FragColor;

void main()
{
    // Diffuse Light - światło rozproszone
    // Ambient - światło bazowe

    vec3 norm = Normal;
    vec3 lightDir = normalize(LightPosition - FragPosition);

    float diffuse = dot(norm, lightDir);
    float ambient = 0.2f;

    vec3 textureColor = texture(texture1, TexCoord).rgb;

    // Finalny kolor
    vec3 lighting = (diffuse + ambient) * textureColor;
    FragColor = vec4(lighting, 1.0);
}

W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
edytowany 5x, ostatnio: tBane
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:427
0

zeby policzyc światło musisz znac pozycje , promień tzn zasięg światła no i kolor , swiatło = 1 / promien , z tego co pamiętam , to będzie swiatło które zaczyna się od punktu, nie robi się światła z kuli ponieważ to było by słońce a takiego czegoś nie da się policzyc poniewaz musiał byś liczyć od wierzchołka kuli z danego polygona osobne natężenie światła , czym więcej polygonów na kuli światła to tym większa ilość liczenia zasięgu od wierzchołków liczenia światła , masz tutaj skrypt shaderowy wersja rozszerzona , pokombinuj z tym:

Kopiuj
[Vertex shader]

varying vec2 texCoord;
varying vec3 lightVec;
varying vec3 viewVec;

uniform vec3 lightPos;
uniform vec3 camPos;

void main(){
	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

	texCoord = gl_MultiTexCoord0.xy;

	vec3 lVec = lightPos - gl_Vertex.xyz;
	lightVec.x = dot(gl_MultiTexCoord1.xyz, lVec);
	lightVec.y = dot(gl_MultiTexCoord2.xyz, lVec);
	lightVec.z = dot(gl_MultiTexCoord3.xyz, lVec);

	vec3 vVec = camPos - gl_Vertex.xyz;
	viewVec.x = dot(gl_MultiTexCoord1.xyz, vVec);
	viewVec.y = dot(gl_MultiTexCoord2.xyz, vVec);
	viewVec.z = dot(gl_MultiTexCoord3.xyz, vVec);
}


[Fragment shader]

uniform sampler2D Base;
uniform sampler2D Bump;

uniform float invRadius;
uniform float ambient;

varying vec2 texCoord;
varying vec3 lightVec;
varying vec3 viewVec;

void main(){
	vec4 base = texture2D(Base, texCoord);
	vec3 bump = texture2D(Bump, texCoord).xyz * 2.0 - 1.0;

	bump = normalize(bump);

	float distSqr = dot(lightVec, lightVec);
	vec3 lVec = lightVec * inversesqrt(distSqr);

	float atten = clamp(1.0 - invRadius * sqrt(distSqr), 0.0, 1.0);
	float diffuse = clamp(dot(lVec, bump), 0.0, 1.0);

	float specular = pow(clamp(dot(reflect(normalize(-viewVec), bump), lVec), 0.0, 1.0), 16.0);
	
	gl_FragColor = ambient * base + (diffuse * base + 0.6 * specular) * atten;
}
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:427
0

tylko w tym przykładzie uwzględniony jest bumpmaping czyli liczenie bumpmap i musisz dostarczyć bumpmape teksture
diffuse to rozproszenie , specular to odbłyski

edytowany 2x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:427
0

temp.rar
tutaj masz teksture 256x256 z bump mapą

CP
  • Rejestracja:2 miesiące
  • Ostatnio:około 2 godziny
  • Postów:47
0

Chodzi ci o światło i cienie na obiekcie czy wokół obiektu?

tBane
  • Rejestracja:prawie 2 lata
  • Ostatnio:9 minut
  • Lokalizacja:Poznań
  • Postów:319
0

Chodzi mi tylko o światło rozproszone tak jak na poniższej grafice
R (2).png


W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
tBane
  • Rejestracja:prawie 2 lata
  • Ostatnio:9 minut
  • Lokalizacja:Poznań
  • Postów:319
0

Dobra mam. Wrzucam kod może ktoś będzie miał porobny problem :-)

screenshot-20250310143323.png

Vertex Shader

Kopiuj
const char* vertex_shader_with_light_source = R"(
    #version 330 core
    layout (location = 0) in vec3 aPos;
    layout (location = 1) in vec2 aTexCoord;
    layout (location = 2) in vec3 aNormal;

    uniform mat4 projection;
    uniform mat4 view;
    uniform mat4 model;

    out vec2 TexCoord;
    out vec3 Normal;
    out vec3 FragPosition;

    void main()
    {
        TexCoord = aTexCoord;
        FragPosition = vec3(model * vec4(aPos, 1.0)); // Transformacja pozycji wierzchołka do przestrzeni świata
        Normal = aNormal;
        gl_Position = projection * view * model * vec4(aPos, 1.0);
    }
)";

Fragment Shader

Kopiuj
const char* fragment_shader_with_light_source = R"(
    #version 330 core

    in vec2 TexCoord;
    in vec3 Normal;
    in vec3 FragPosition;

    uniform sampler2D texture1;

    uniform vec3 LightPosition;
    uniform vec3 CamPosition;
    uniform float LightPower;
    uniform float LightRange;

    out vec4 FragColor;

    void main()
    {
        // Diffuse Light - światło rozproszone
        // Specular Light - światło odbite
        // Ambient - światło bazowe

        vec3 norm = normalize(Normal);
        vec3 lightDir = normalize(LightPosition - FragPosition);
        
        float diffuse = max(dot(norm, lightDir)*LightRange, 0.0f);
        float ambient = 0.0f;

        vec3 textureColor = texture(texture1, TexCoord).rgb;

        // Finalny kolor
        vec3 result = (diffuse*LightPower + ambient) * textureColor;
        FragColor = vec4(result, 1.0);
    }
)";

W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
edytowany 3x, ostatnio: tBane

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.