Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - Glasgow

Strony: [1]
1
OpenGL / Zamiana VBOs w VAO
« dnia: Sierpień 15, 2017, 13:15:16 »
Moje VBO jest dynamicznego rozmiaru - założyłem sobie prawdopodobnie maksymalny rozmiar, co nie oznacza, że musi taki być, więc muszę przygotować kod na ewentualne przekroczenie tego rozmiaru.
Tworzę więc kopię tego VBO z dodatkowym miejscem. Pojawia się pytanie jak zamienić te VBO w VAO?
Muszę jakoś odbindować stare VBO? Czy po prostu usunąć je i zbindować nowe?
Słyszałem o rozszerzeniu dostarczonym przez AMD - ARB_sparse_buffer - jednak pierwszą wersje kodu wolałby, użyć bez niego.

2
OpenGL / Odp: Deffered shading - różne metody oświetlenia / materiały
« dnia: Sierpień 15, 2017, 11:24:43 »
Ok, dzięki za rady, dokończę teraz co wcześniej robiłem i biorę się za materiały.

3
OpenGL / Deffered shading - różne metody oświetlenia / materiały
« dnia: Sierpień 13, 2017, 19:29:53 »
Hej,
zastanawiam się w jaki sposób w deffered shading używać różnych materiałów - rodzajów oświetlenia?
Pierwotnie myślałem nad wysyłaniem poprzez G-Buffer ID typu materiału i w postprocessing'u wstawić if'y, ale przy rozdzielczości full hd może to dosyć dużo kosztować.
Druga sprawa jaki format użyć do wysyłania tych ID'ków, unsigned z jednym komponentem np. red?

Czy jakoś inaczej to zrealizować?

4
Kombinowałem z SRGB. Po przekształceniach stwierdziłem, że problem nie leży w korekcji gamma.
Problem został rozwiązany - kompresje wykonywałem na CPU, teraz wykonuję na GPU i różnica jest spora - mniej artefaktów (dziwnych pikseli) oraz barwa się poprawiła. Wynika, że złe wartości pikseli pobierał do RAM'u, bo test był wykonywany również bez kompresji.
Zauważyłem, że po aktualizacji sterowników od karty graficznej (NvIDIA) pojawiają się czasem błędy, których wcześniej nie było, może to było i jest przyczyną.

5
Testowałem kilka możliwości i jednak nie zakres barw jest problemem.
Po wyłączeniu kompresji barwa jest podobna (nie identyczna) do źródła.
Teksturę kompresuję do DXT5 - próbowałem kompresować lepszym algorytmem - niestety tekstura nadal wygląda jakby była ciemniejsza.

Oświetlenie jest wyłączone.
Nie korzystam z HDR (jeszcze).

6
Obraz renderowany na ekran jest inny od obrazu renderowanego do tekstury - prawdopodobnie różnica zakresu barw (?).

Zależy mi na tym, żeby obrazy były identyczne lub chociaż podobne.
Tekstura jest używana w późniejszym etapie do renderowania billboardów drzew, zatem pobieranie float zamiast unsigned char nie jest dobrym rozwiązaniem (duża liczba instancji).
Czy jest możliwość ograniczenia zakresu barw podczas właściwego renderowania (na ekran)?

Oczywiście pomijając GL_NEAREST.

7
OpenGL / Tablica GL_TEXTURE_BUFFER
« dnia: Maj 01, 2017, 20:04:37 »
Przeprowadzam depth culling oraz occlusion culling na GPU dla grup obiektów, które są renderowane jako instancje (nie mogę przeprowadzić tych testów na CPU).
Chcę od razu odrzucić te grupy, które są puste - łącznie grup jest ~1000.
Myślałem żeby sprawdzić czy pole (grupa) jest widoczne (raz - ponieważ modele nie zmieniają pozycji np. drzewa itd.) -> upakować je do GL_TEXTURE_BUFFER i w GPU wyliczać, dla którego pola jest przeprowadzany test - wynik pobrać za pomocą funkcji texelFetch().
Problem w tym, że musiałbym zrobić tablicę GL_TEXTURE_BUFFER (jeden bufor na 1 chunk terenu).
Czy jest możliwość zrobienia z GL_TEXTURE_BUFFER tablicy?

A może inaczej to zrobić?

8
OpenGL / Persistent Mapped Buffer warty uwagi?
« dnia: Kwiecień 29, 2017, 15:49:26 »
Szukam sposobu optymalizacji mojego kodu i natknąłem się na Persistent Mapped Buffer.
Aktualizuję dane (~1000 zmiennych) średnio raz na 50 klatek. 
Przeglądałem benchmarki i zgłupiałem czy to w ogóle jest warte zachodu?
Czas jest większy niż przy zwykłym mapowaniu. Czy ja coś źle zrozumiałem (mój angielski jest średni).

9
OpenGL / Odp: Cone Step Mapping nieprawidłowe wyniki
« dnia: Kwiecień 21, 2017, 14:08:09 »
Kosztowało mnie to nockę ale wreszcie się udało - myślałem, że eye space to po prostu normalne pomnożone przez transpose(inverse(mat3(Model_Matrix))), gdzie Model_Matrix jest jednostkowy - bo to teren, zatem mogę to pominąć.
Należało uwzględnić jednak nie Model_Matrix, a ModelView_Matrix oraz zanegować bitangent (dlaczego? nadal nie wiem :P).

To tak dla osób, które spotkałyby się z podobnym problemem - macie rozwiązanie na tacy.

10
OpenGL / Cone Step Mapping nieprawidłowe wyniki
« dnia: Kwiecień 20, 2017, 23:15:56 »
Próbuję zaimplementować Cone Step Mapping - korzystam z przykładowego kodu ze strony:
http://lonesock.net/files/ConeStepMapDemo.zip

Wynik działania programu:

Jak widać tekstury są zniekształcone.

Normalne:


Tessellation Evaluation Shader:
out vec2 esLocalCoord;
out vec3 esNormal;
out vec3 esTangent;

out vec3 esVert;
out vec3 esTextureSpaceVert;
out vec3 esTextureSpaceLightPos;
out float lightDist;
out float esDepth;
// ...

// funkcja main - pomijam nieistotne obliczenia
// ...

vec2 worldPos2D = interpolate2D();

// Wyliczam normalną, tangent, bitangent mając daną mapę wysokości.
height = texture(heightMap, vec3(esGlobalCoord, esIndexMap)).r * terrainInfo.w;

esLocalCoord = esGlobalCoord * 30.0;

vec3 off = vec3(1.0, 1.0, 0.0);
float hLeft = GetHeight(worldPos2D - off.xz);
float hRight = GetHeight(worldPos2D + off.xz);
float hFar = GetHeight(worldPos2D + off.zy);
float hNear = GetHeight(worldPos2D - off.zy);

esNormal.x = hLeft - hRight;
esNormal.y = hNear - hFar;
esNormal.z = 2.0;

esNormal = normalize(esNormal);
esTangent = normalize(vec3(1.0, 0.0, (hRight - hLeft) / 2.0));

esVert = vec3(worldPos2D.x, worldPos2D.y, height);
gl_Position  = vpMatrix * vec4(esVert, 1.0);


vec3 bitangent = normalize(cross(esTangent, esNormal));
esTextureSpaceVert = vec3(
dot(esTangent, gl_Position.xyz),
dot(bitangent, gl_Position.xyz),
dot(esNormal, gl_Position.xyz)
);

esTextureSpaceLightPos = vec3(
dot(esTangent, -light.position.xyz),
dot(bitangent, -light.position.xyz),
dot(esNormal, -light.position.xyz)
);
lightDist = length(esTextureSpaceLightPos);
//...


Fragment Shader:

#version 420

layout(early_fragment_tests) in;

const uint NUM_TEXTURES = 256;

const float depth = 0.3f;
const int conesteps = 50;
const float texSize = 512.0;

in vec2 esLocalCoord;
in vec3 esNormal;
in vec3 esTangent;

in vec3 esVert;
in vec3 esTextureSpaceVert;
in vec3 esTextureSpaceLightPos;
in float lightDist;
in float esDepth;

uniform sampler2DArray textures;
uniform sampler2DArray coneStepMap;

uniform uint textureID;
uniform int[NUM_TEXTURES] coneStepMapID;

out vec3 fragColor;

void intersect_square_cone_step (inout vec3 dp, in vec3 ds, in uint textureID)
{
float iz = max(abs(ds.x),abs(ds.y));
const float w = 1.2;
vec4 t;
dp += 0.3 * ds;

t = texture(coneStepMap, vec3(dp.xy, textureID));

dp += ds * w * (t.r - dp.z) / (iz/(t.g*t.g) + 1.0);

t = texture(coneStepMap, vec3(dp.xy, textureID));
dp += ds * w * (t.r - dp.z) / (iz/(t.g*t.g) + 1.0);
t = texture(coneStepMap, vec3(dp.xy, textureID));
dp += ds * w * (t.r - dp.z) / (iz/(t.g*t.g) + 1.0);


t = texture(coneStepMap, vec3(dp.xy, textureID));
dp += ds * w * (t.r - dp.z) / (iz/(t.g*t.g) + 1.0);
t = texture(coneStepMap, vec3(dp.xy, textureID));
dp += ds * w * (t.r - dp.z) / (iz/(t.g*t.g) + 1.0);
t = texture(coneStepMap, vec3(dp.xy, textureID));
dp += ds * w * (t.r - dp.z) / (iz/(t.g*t.g) + 1.0);
t = texture(coneStepMap, vec3(dp.xy, textureID));
dp += ds * w * (t.r - dp.z) / (iz/(t.g*t.g) + 1.0);
t = texture(coneStepMap, vec3(dp.xy, textureID));
dp += ds * w * (t.r - dp.z) / (iz/(t.g*t.g) + 1.0);
     
return;
}

vec3 ConeStepMapping(vec2 texCoord, uint textureID)
{
float a = -depth / esTextureSpaceVert.z;
vec3 s = esTextureSpaceVert * a;
s.z = 1.0;

vec3 pt_eye = vec3(texCoord, 0.0);
intersect_square_cone_step (pt_eye, s, coneStepMapID[textureID]);

vec4 c = texture(textures, vec3(pt_eye.xy, textureID));

vec4 t = texture(coneStepMap, vec3(pt_eye.xy, textureID));
t = vec4 ((t.ba-0.5) * (-depth * texSize), 1.0, 0.0);
t=normalize(t);

   // adjust the hit-position
   // (only useful if the light is near relative
   // to the depth)
   //p -= v*d*a;
   
   // compute attenuation
float att = 0.001;
att = min (1.0, 1.0 / (lightDist * att));

vec3 l = att * normalize(esTextureSpaceLightPos);

return vec3(0.34, 0.34, 0.34)*c.xyz
    + vec3(0.34, 0.34, 0.34) * c.xyz * max(0.0,dot(l,t.xyz));
}

void main () {
vec3 diffuseMap;
if(coneStepMapID[textureID] != -1)
diffuseMap = ConeStepMapping(esLocalCoord, textureID);
else
{
// inne obliczenia
}


fragColor = diffuseMap;
// <-
}

To są shadery mapy wysokości (terenu).
Wiele danych jak np. oświetlenie zostały wpisane na sztywno żeby spr. czy działa prawidłowo.
Obracając kamerę góra-dół obraz obraca się w boki (nie jak kamera góra-dół).
Co jest źle robione?



Z tymi samymi parametrami (tylko inna powierzchnia na której renderuję teksturę) program przykładowy wygląda tak:



Strony: [1]