[OpenGL] Projective Texturing adhv Shadow Mapping

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Boondock_Saint
  • Registratie: Januari 2001
  • Laatst online: 18-11-2023
Aan de hand van verschillende tutorials probeer ik projective texture mapping aan de praat te krijgen. Ik heb dit eerst via de shader weg geprobeerd, wat helaas niet werkte. Nu probeer ik het via de vaste OpenGL functionaliteit, waarbij ik deze shadow mapping tutorial volg:

http://www.cc.gatech.edu/~jtan34/shadowMappingTutorial.html

Het idee is om op een kubus een texture te projecteren. Waar moet ik in mijn code dan de texture toevoegen? Als ik namelijk de shadow map bind, dan kan ik de texture niet meer binden.

Ook hoef ik het volgens mij maar 2x te renderen en niet 3x zoals nu gebeurt, klopt dit?

Er is wel informatie over projective texturing te vinden, helaas alleen niet veel en zeker niet concreet.

De code:

C++:
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
void RenWin::drawGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /* Step 1: Place camera at projector position and determine visibility */

    // set projector viewport
    glViewport(0, 0, m_pcProjector->getWidth(), m_pcProjector->getHeight());

    // set projector projection matrix
    Matrix4x4 cProjProjectionMat;
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluPerspective(30.0f, (GLfloat) m_pcProjector->getWidth() / (GLfloat) m_pcProjector->getHeight(), 0.1f, 400.0f);
    glGetFloatv(GL_PROJECTION_MATRIX, cProjProjectionMat);

    // set projector view matrix
    Matrix4x4 cProjViewMat;
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    gluLookAt(0.0f, 20.0f, -50.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    glGetFloatv(GL_MODELVIEW_MATRIX, cProjViewMat);

    // draw scene
    glShadeModel(GL_FLAT);
    glColorMask(0, 0, 0, 0);
    glutSolidCube(10.0f);

    // pop state
    glViewport(0, 0, m_uiWidth, m_uiHeight);
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();

    /* Step 2: Create depth map*/

    // create depth map
    GLuint gluiDepthMapId;
    glGenTextures(1, &gluiDepthMapId);
    glBindTexture(GL_TEXTURE_2D, gluiDepthMapId);
    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, m_pcProjector->getWidth(), m_pcProjector->getHeight(), 0);

    // place camera
    gluLookAt(0.0f, 0.0f, -50.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    // render again TODO: Necessary?
    glShadeModel(GL_SMOOTH);
    glColorMask(1, 1, 1, 1);
    glClear(GL_DEPTH_BUFFER);
    glEnable(GL_LIGHT1);
    glEnable(GL_LIGHTING);
    glutSolidCube(10.0f);

    /* Step 3: Render illuminated part i.e. with texture */

    // Set up texture matrix
    Matrix4x4 cBiasMat(
            0.5f, 0.0f, 0.0f, 0.0f,
            0.0f, 0.5f, 0.0f, 0.0f,
            0.0f, 0.0f, 0.5f, 0.0f,
            0.5f, 0.5f, 0.5f, 1.0f
    );
    Matrix4x4 cTextureMat = cBiasMat * cProjProjectionMat * cProjViewMat;

    // Set up OpenGL texture generation
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    glTexGenfv(GL_S, GL_EYE_PLANE, cTextureMat[0]);
    glEnable(GL_TEXTURE_GEN_S);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    glTexGenfv(GL_T, GL_EYE_PLANE, cTextureMat[1]);
    glEnable(GL_TEXTURE_GEN_T);
    glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    glTexGenfv(GL_R, GL_EYE_PLANE, cTextureMat[2]);
    glEnable(GL_TEXTURE_GEN_R);
    glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
    glTexGenfv(GL_Q, GL_EYE_PLANE, cTextureMat[3]);
    glEnable(GL_TEXTURE_GEN_Q);
    glEnable(GL_TEXTURE_2D);

    // Set up depth comparison
    glBindTexture(GL_TEXTURE_2D, gluiDepthMapId);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
    glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
    glAlphaFunc(GL_GEQUAL, 0.99f);
    glEnable(GL_ALPHA_TEST);

    glutSolidCube(10.0f);

    glutSwapBuffers();
}

Blasphemy is a victimless crime


Acties:
  • 0 Henk 'm!

  • Gorion3
  • Registratie: Februari 2005
  • Laatst online: 24-08 08:28

Gorion3

ABC++

Hmm, als ik het goed begrijp wil je dus eigenlijk gewoon shadow mapping? Want welke texture wil je anders gaan projecten..

Awesomenauts! Swords & Soldiers


Acties:
  • 0 Henk 'm!

  • Boondock_Saint
  • Registratie: Januari 2001
  • Laatst online: 18-11-2023
Ja, dat is dus het probleem :)

Ik wil projective texturing, maar omdat dat zoveel samenhangt met shadow mapping (en omdat er geen duidelijke tutorials zijn voor projective texturing) heb ik die tutorial gevolgd en gehoopt dat ik het wel om kon bouwen.

Had ook nog deze tutorial gevonden voor shaders, maar dat krijg ik niet aan de praat:

http://www.ozone3d.net/tutorials/glsl_texturing_p08.php


Echter heb ik net wel een veelbelovend voorbeeld gevonden:

http://www.opengl.org/res...jktips/projtex/index.html

Dus daar ga ik mee aan de slag :)

Blasphemy is a victimless crime