Du bist nicht angemeldet.

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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

91

25.08.2011, 14:43

Die alte musst Du schon selbst löschen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

92

25.08.2011, 14:44

Und die alte wird gelöscht und verursacht kein Speicherloch?

Darum kümmert sich der Treiber.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

93

25.08.2011, 14:48

Zitat

Die alte musst Du schon selbst löschen.


oder

Zitat

Darum kümmert sich der Treiber.


So jetzt muss ich mich entscheiden................. GOOGLE ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

94

25.08.2011, 14:53

BlueCobold redet vermutlich davon, dass du deinen Namen, den du mit glGenTextures() erzeugt hast, per glDeleteTextures() freigeben sollst. Wenn du vorhast, per glGenTextures() einen neuen Namen für die vergrößerte Textur anzufordern musst du das. Ich würde aber den Namen weiterverwenden und einfach für deine vorhandene Shadowmap glTexImage2D() aufrufen. Damit drückst du aus, dass die Textur auf die der Name sich bezieht, gegen eine neue getauscht werden soll und der Treiber wird die alte freigeben. Ähnlich funktioniert das z.B. auch bei VBOs mit glBufferData(), um so etwas wie D3DLOCK_DISCARD-Semantik für glMapBuffer() zu erreichen.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

95

25.08.2011, 15:53

Zitat

Ähnlich funktioniert das z.B. auch bei VBOs mit glBufferData(), um so etwas wie D3DLOCK_DISCARD-Semantik für glMapBuffer() zu erreichen.


Stimmt ok, dann bind ich die einfach und ruf glTexImage2D() auf.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

96

25.08.2011, 21:34

Ja, dot, genau darum ging es mir. Denn es klang so als wolle er einfach mit glGenTextures neue Texturen anlegen und die alten einfach... vergessen. Das geht natürlich nicht, die werden nicht von allein aufgeräumt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

97

25.08.2011, 21:55

Zitat

Ja, dot, genau darum ging es mir. Denn es klang so als wolle er einfach mit glGenTextures neue Texturen anlegen und die alten einfach... vergessen. Das geht natürlich nicht, die werden nicht von allein aufgeräumt.


Das war mir bewust, es ging mehr darum ob ich den Namen weiter verwenden kann. Nächste mal frag ich präziser sorry.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

98

25.08.2011, 22:03

Wollte nur sicher gehen ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

99

03.10.2011, 21:11

Hallo!

Ich dachte ich schreibe einfach mal hier unten dran, da mein Problem im Prinzip das Selbe ist.

Hier mal ein Video von dem, was ich bis jetzt hab:
Klick

Die Shadowmap wird korrekt gerendert:
Klick

Die Shader sind eigentlich exakt die Selben wie die von DeKugelschieber.

Genau wie in diesem Tutorial schreibe ich die Matrix aus der Sicht der Lichtquelle multipliziert mit der Biasmatrix in den Matrix-Stack von GL_TEXTURE7 (ich weiß, dass das nicht gerade die beste Lösung ist).

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
void setTextureMatrix()
{
static double modelView[16];
static double projection[16];

// This is matrix transform every coordinate x,y,z
// x = x* 0.5 + 0.5 
// y = y* 0.5 + 0.5 
// z = z* 0.5 + 0.5 
// Moving from unit cube [-1,1] to [0,1]  
const GLdouble bias[16] = {
0.5, 0.0, 0.0, 0.0, 
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0};

// Grab modelview and transformation matrices
glGetDoublev(GL_MODELVIEW_MATRIX, modelView);
glGetDoublev(GL_PROJECTION_MATRIX, projection);


glMatrixMode(GL_TEXTURE);
glActiveTextureARB(GL_TEXTURE7);

glLoadIdentity();
glLoadMatrixd(bias);

// concatating all matrice into one.
glMultMatrixd (projection);
glMultMatrixd (modelView);

// Go back to normal matrix mode
glActiveTextureARB(GL_TEXTURE0);
glMatrixMode(GL_MODELVIEW);
}


Mein Displayfunktion sieht folgendermaßen aus

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
67
68
69
70
71
72
73
74
75
// Renderfunktion
void display(){

////// Shadowmap erstellen

// mit der Standard Pipeline in einen Framebuffer rendern ohne Farbe rendern, es keinen Farbbuffer gibt
glBindFramebuffer(GL_FRAMEBUFFER, depthFBO);
glUseProgram(0);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDisable(GL_TEXTURE_2D);

// FBO clearen
glClear(GL_DEPTH_BUFFER_BIT);
//setOrthographicMatrix();

// Kameramatrix erstellen
glLoadIdentity();
float xCam = cos(alpha/100);
float yCam = 3.0f;
float zCam = sin(alpha/100);

gluLookAt(xCam, yCam, zCam, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0);

glCullFace(GL_FRONT);
renderScene();

//Kameramatrix in Texturmatriz#7 kopieren
setTextureMatrix();

////// Szene mit Schatten rendern

// in StandardBackBuffer rendern mit dem Schattenshader
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glUseProgram(shadowShaderProgram);

// BiasModelViewProjectionMatrix von der Shadowmap und die Shadowmap selber in Shader kopieren

glUniform1i(shadowMapUniform,7);
glActiveTexture(GL_TEXTURE7);
glBindTexture(GL_TEXTURE_2D, depthTexture);

// Wieder mit Farbe rendern
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

// Backbuffer clearen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//setPerspectiveMatrix();

// Kameramatrix erstellen
glLoadIdentity();
float x = dist * sin(theta) * cos(phi);
float y = dist * cos(theta);
float z = dist * sin(theta) * sin(phi);
if(!camView)
gluLookAt(x, y, z, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
else
gluLookAt(xCam, yCam, zCam, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0);

glCullFace(GL_BACK);
renderScene();


// Lichtquelle visualisieren
if(!camView){
glUseProgram(0);
glPushMatrix();
glTranslatef(xCam,yCam,zCam);
glUseProgram(0);
glColor3f(1,1,1);
glutSolidSphere(0.2,10,10);
glPopMatrix();
}

glutSwapBuffers();
}


So sieht der Shader aus:

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
//////VERTEX//////

varying vec4 shadowCoord;

void main(){
    gl_Position = ftransform();

    shadowCoord =  gl_TextureMatrix[7] * gl_Vertex;

    gl_FrontColor = gl_Color;
}

//////FRAGMENT//////

uniform sampler2D shadowMap;

varying vec4 shadowCoord;

void main(){
    vec4 shadowCoordinateWdivide = shadowCoord / shadowCoord.w ;
    
    // Used to lower moiré pattern and self-shadowing
    shadowCoordinateWdivide.z += 0.0005;
    
    float distanceFromLight = texture2D(shadowMap,shadowCoordinateWdivide.xy).z;
    
    float shadow = 1.0;
    if (shadowCoord.w > 0.0)
        shadow = distanceFromLight < shadowCoordinateWdivide.z ? 0.1 : 1.0 ;

    gl_FragColor =   shadow * gl_Color;
}


Ich hoffe, dass das hier noch jemand liest und vielleicht ein Idee hat was das Problem sein könnte. Ich bin glaube ich gerade einfach betriebsblind :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

100

03.10.2011, 21:14

Was genau funktioniert denn nicht? Wenn ich mir deine Shadowmap so anschau, entspricht das, was im Video zu sehen ist, eigentlich genau dem, was ich erwarten würde!?

Werbeanzeige