Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
idontknow
unregistriert
HLSL-Quelltext |
|
1 2 3 4 5 |
// calculate matrix vec3 biTangentVector = cross(tangentVector, normal); tangentSpace[0] = tangentVector; tangentSpace[1] = biTangentVector; tangentSpace[2] = normal; |
HLSL-Quelltext |
|
1 2 3 4 |
vec3 lightDir = normalize(light.Position - worldPos); vec3 bumpMapNormal = texture(normalMap, texCoord).xyz; vec3 normal = tangentSpace * (2) * bumpMapNormal.xyz - vec3(1); float dotProduct = dot(normal, lightDir); |
C-/C++-Quelltext |
|
1 2 3 4 5 |
// front face glm::vec3(-1.0, -1.0, 1.0), glm::vec3(+1.0, -1.0, 1.0), glm::vec3(+1.0, +1.0, 1.0), glm::vec3(-1.0, +1.0, 1.0) |
C-/C++-Quelltext |
|
1 |
20, 21, 22, 20, 22, 23 |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
for (unsigned i = 0; i < 6; i++) // per face { glm::vec3 tangentVecOne; { unsigned triOne[3] = { indices[i * 6 + 0], indices[i * 6 + 1], indices[i * 6 + 2] }; glm::vec3 edge21 = positions[triOne[1]] - positions[triOne[0]]; glm::vec2 edge21Tex = texCoords[triOne[1]] - texCoords[triOne[0]]; glm::vec3 edge31 = positions[triOne[2]] - positions[triOne[0]]; glm::vec2 edge31Tex = texCoords[triOne[2]] - texCoords[triOne[0]]; if (edge21Tex.x == 0.0f) { tangentVecOne = glm::normalize(edge31 / edge31Tex.x); } else { tangentVecOne = glm::normalize(edge21 / edge21Tex.x); } glm::vec3 normalVec = normals[i * 4]; //glm::vec3 biTangentVec = glm::cross(tangentVecOne, normalVec); } tsAxis[i * 4 + 1] = tangentVecOne; glm::vec3 tangentVecTwo; { unsigned triOne[3] = { indices[i * 6 + 3], indices[i * 6 + 4], indices[i * 6 + 5] }; glm::vec3 edge21 = positions[triOne[1]] - positions[triOne[0]]; glm::vec2 edge21Tex = texCoords[triOne[1]] - texCoords[triOne[0]]; glm::vec3 edge31 = positions[triOne[2]] - positions[triOne[0]]; glm::vec2 edge31Tex = texCoords[triOne[2]] - texCoords[triOne[0]]; if (edge21Tex.x == 0.0f) { tangentVecTwo = glm::normalize(edge31 / edge31Tex.x); } else { tangentVecTwo = glm::normalize(edge21 / edge21Tex.x); } glm::vec3 normalVec = normals[i * 4]; } tsAxis[i * 4 + 3] = tangentVecTwo; glm::vec3 avgTangentVec = (tangentVecOne + tangentVecTwo) / 2.0f; tsAxis[i * 4 + 0] = tsAxis[i * 4 + 2] = avgTangentVec; tsAxis[i * 4] = tsAxis[i * 4 + 1] = tsAxis[i * 4 + 2] = tsAxis[i * 4 + 3] = tangentVecOne; } |
Zitat
Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.
HLSL-Quelltext |
|
1 2 3 4 5 |
// Was ist denn das für ein Unfug? Punkt vor Strich! ;-) vec3 normal = tangentSpace * (2) * bumpMapNormal.xyz - vec3(1); // Davon abgesehen ist es gut möglich, dass Z in der // Normalmap kein Biasing erfordert, da Normalen in // Normalmaps in der Regel immer weg von der Oberfläche zeigen |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CodingCat« (06.03.2014, 19:58)
idontknow
unregistriert
Funktioniert denn alles, wenn du keine Normal-Map benutzt?
HLSL-Quelltext
1 2 3 4 5 // Was ist denn das für ein Unfug? Punkt vor Strich! ;-) vec3 normal = tangentSpace * (2) * bumpMapNormal.xyz - vec3(1); // Davon abgesehen ist es gut möglich, dass Z in der // Normalmap kein Biasing erfordert, da Normalen in // Normalmaps in der Regel immer weg von der Oberfläche zeigen
Weiterhin ist es keine gute Idee, die ganze Matrix von Vertex in Fragment Shader zu verschieben, mehr als 4 interpolierte Vektoren ziehen die Performance in der Regel ordentlich in den Keller. Wenn du die eh nur aus Tangente und Normale berechnest, mach das lieber gleich im Fragment Shader.
Was rechnest du denn bei der Bestimmung der Tangente? Selbst ausgedacht? Wenn ja - hervorragend dass du es probierst, erklär mal was du da tust! - wenn nein - Quelle?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »idontknow« (07.03.2014, 01:37)
Werbeanzeige