self shadow bump mapping

self shadow bump mapping
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:5 dni
  • Postów:427
0

szukam technologi tzn systemu działania techniki self shadow bump mapping , na humus.name jest ale poszili po rozum do głowy i trzeba się zalogowac i nie ma jak podejrzeć skryptu shaderowego , chce to użyć w swoim projekcie w wersji 2D , jak ktoś ma pomysł albo wiedze to z góry dziękuje .... jak to działa to ja wiem tylko jak to zaimplementować w praktyce na liczeniu

CosherJeepersCreepers
użyj lepiej normal mappingu
loza_prowizoryczna
loza_prowizoryczna
Wypal wszystko i nakręć shorta na YT.
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:5 dni
  • Postów:427
0

bump mapping podstawowy z bump mapy czarno-białej to ja mam działa właściwie tylko to mozna ulepszyć o dodatkowe cienie na różnicach przy wysokościach wyboju pixeli ktore są tymi wysokościami podczas sprawdzania kolizji różnic tych pixeli wysokościowych ta technologia nazywa się self shadow bump mapping a tutaj przykład diffuse i atten; bez self shadow bmp mapping :

Kopiuj
void RendererLightBM(int x,int y,int r)
	{
		for(int py=y-r;py<y+r;py+=1)
		{
			for(int px=x-r;px<x+r;px+=1)
			{  
				float r2=1-sqrt( (px-x)*(px-x)+(py-y)*(py-y))/float(r);
				if(r2<0)
					r2=0;
				if(r2>1)
					r2=1;
				if(r2>0)
				{

				unsigned char red;
				unsigned char green;
				unsigned char blue;

				unsigned char leftred,leftgreen,leftblue;
				unsigned char rightred,rightgreen,rightblue;
				unsigned char upred,upgreen,upblue;
				unsigned char downred,downgreen,downblue;
				float left,right,up,down;
				float poziom,pion;
				GetPixel(px-1,py,leftred,leftgreen,leftblue);//tutaj zaczyna liczyć bump mape
				GetPixel(px+1,py,rightred,rightgreen,rightblue);
				GetPixel(px,py-1,upred,upgreen,upblue);
				GetPixel(px,py+1,downred,downgreen,downblue);

				left=float(float(leftred)/255+float(leftgreen)/255+float(leftblue)/255)/3;
				right=float(float(rightred)/255+float(rightgreen)/255+float(rightblue)/255)/3;
				up=float(float(upred)/255+float(upgreen)/255+float(upblue)/255)/3;
				down=float(float(downred)/255+float(downgreen)/255+float(downblue)/255)/3;// a tutaj konczy

				poziom=(left+right)/2;
				pion=(up+down)/2;
				float lenght=sqrt(poziom*poziom+pion*pion);
				poziom=poziom/lenght;
				pion=pion/lenght;
				float lightDirX,lightDirY;
				lightDirX=x+r;
				lightDirY=y+r;
				lightDirX=lightDirX-px;
				lightDirY=lightDirY-py;
				lenght=sqrt(lightDirX*lightDirX+lightDirY*lightDirY);
				lightDirX=lightDirX/lenght;
				lightDirY=lightDirY/lenght;
				float S=lightDirX*poziom+lightDirY*pion;
				if(S<0)
					S=0;
				if(S>1)
					S=1;
				GetPixel(px,py,red,green,blue);
				float r1,g1,b1;

				r1=float(red)/255;
				g1=float(green)/255;
				b1=float(blue)/255;
		
				float r,g,b;
				r=r1;
				g=g1;
				b=b1;
				
				
				r1=(1-r1)*S*r2*r1*2+r1;
				g1=(1-g1)*S*r2*g1*2+g1;
				b1=(1-b1)*S*r2*b1*2+b1;

				if(r1<r)
					r1=r;
				if(g1<g)
					g1=g;
				if(b1<b)
					b1=b;

				if(r1>1)
					r1=1;
				if(g1>1)
					g1=1;
				if(b1>1)
					b1=1;
				unsigned char rW=r1*255;
				unsigned char gW=g1*255;
				unsigned char bW=b1*255;
				
			
				Color3iT(rW,gW,bW);
				PutPixelT(px,py);
				}

			}
		}
	}

screenshot-20250404112453.png

edytowany 2x, ostatnio: wilkwielki
tBane
Ile to ma FPS?
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:5 dni
  • Postów:427
0

to jest ta sama tekstura tylko lewa strona normalna a prawa ściemniona o połowe ...

wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:5 dni
  • Postów:427
0

DrawConsole.rar
klawisze A W S D a Esc-wyjscie

wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:5 dni
  • Postów:427
0

mam z chatGPT przykład ale nie ma liczonej shadow mapy na bieżąco tylko zapodana z pliku a to mi nie pasuje , troche to trudne bo 3D przerobić to na 2D nie bedzie tak łatwo:

Kopiuj
#version 330 core

in vec3 FragPos; // Fragment position
in vec3 Normal;  // Normal vector
in vec2 TexCoords; // Texture coordinates

uniform sampler2D bumpMap;    // Bump map texture
uniform sampler2D shadowMap;  // Shadow map texture
uniform vec3 lightPos;        // Light position
uniform vec3 viewPos;         // Camera position

out vec4 FragColor;

float ShadowCalculation(vec4 fragPosLightSpace) {
    // Transform fragment position to light space (shadow map space)
    vec3 projCoords = fragPosLightSpace.xyz / fragPosLightSpace.w;
    projCoords = projCoords * 0.5 + 0.5;  // Normalize coordinates to [0,1]

    float currentDepth = projCoords.z;  // Depth of the current fragment
    float shadow = 0.0;

    // Check if the current fragment is in shadow
    if (currentDepth > texture(shadowMap, projCoords.xy).r) {
        shadow = 1.0;  // Shadowed
    } else {
        shadow = 0.0;  // Not shadowed
    }

    return shadow;
}

void main() {
    // Sample the bump map to get the normal at this fragment
    vec3 bumpNormal = texture(bumpMap, TexCoords).rgb;
    bumpNormal = normalize(bumpNormal * 2.0 - 1.0); // Normalize normal map value [-1, 1]

    // Lighting calculations
    vec3 lightDir = normalize(lightPos - FragPos); // Light direction
    vec3 viewDir = normalize(viewPos - FragPos);   // View direction
    vec3 halfDir = normalize(lightDir + viewDir);  // Halfway vector for specular reflection

    // Phong shading
    float diffuse = max(dot(bumpNormal, lightDir), 0.0);
    float specular = pow(max(dot(bumpNormal, halfDir), 0.0), 32.0);  // Shininess = 32

    // Shadow calculation
    vec4 fragPosLightSpace = model * vec4(FragPos, 1.0);  // Model matrix to light space
    float shadow = ShadowCalculation(fragPosLightSpace);

    // Final color (ambient + diffuse + specular + shadow)
    vec3 ambient = 0.1 * vec3(1.0, 1.0, 1.0);  // Ambient light
    vec3 color = (ambient + (1.0 - shadow) * (diffuse + specular)) * vec3(1.0, 1.0, 1.0);

    FragColor = vec4(color, 1.0);
}
edytowany 1x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:5 dni
  • Postów:427
0

tutaj jest algorytm do tego : https://www.humus.name/index.php?page=Comments&ID=101&start=0
tutaj mozna pobrać projekt https://www.humus.name/index.php?page=3D&start=48
albo link już sam : https://www.humus.name/3D/SelfShadowBump.zip

Kopiuj
float3 n = tex2D(Bump, texCoord) * 2.0 - 1.0;
n = normalize(n);
float height = tex2D(Elev, texCoord) * 2.0 - 1.0;
float nh = max(min(viewVec.z * n.z * height / max( dot(viewVec, n), 0), 1), -1);
float2 newTexCoord = texCoord + viewVec.xy * nh * 0.04;

potrafi ktoś to rozkodować? no i do tego żeby było w wersji 2D ... 😕
sprawa ma sie do tego że jest przesuwana tekstura i ona jest teksturą wyjściową sama w sobie cieniem która ma ciemną po świate tyle wiem po analizie

edytowany 5x, ostatnio: wilkwielki

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.