Toon posts:

[OpenGL] Projective Texturing adhv Shadow Mapping

Pagina: 1
Acties:

Onderwerpen


  • Boondock_Saint
  • Registratie: januari 2001
  • Laatst online: 17-08 14:00
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


  • Gorion3
  • Registratie: februari 2005
  • Laatst online: 23-09 22:38

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


  • Boondock_Saint
  • Registratie: januari 2001
  • Laatst online: 17-08 14:00
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



Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee