java - Java OpenGL / LWJGL 体素纹理
问题描述
我正在按照 YouTube 教程系列进行 3D 渲染项目。我已经使用 OBJ 文件格式渲染 3D 纹理模型。
使用教程提供的模型进行 3D 渲染:
问题是,当我制作自己的基于体素的模型时,纹理会奇怪地映射到对象。
具有扭曲纹理的简单 2 色体素立方体:
据我所知,这是某种插值问题,但我对 3D OpenGL 框架不够熟悉,无法确定。
任何帮助将不胜感激。
OBJ文件:
# www.blender.org
mtllib grass2.mtl
o ObjObject
v -0.400000 0.500000 0.300000
v -0.400000 0.000000 -0.400000
v -0.400000 -0.000000 0.400000
v -0.400000 0.500000 0.100000
v -0.400000 0.500000 0.000000
v -0.400000 0.500000 -0.300000
v -0.400000 0.600000 0.400000
v -0.400000 0.600000 0.300000
v -0.400000 0.600000 0.100000
v -0.400000 0.600000 0.000000
v -0.400000 0.600000 -0.300000
v -0.400000 0.600000 -0.400000
v -0.400000 0.800000 0.400000
v -0.400000 0.800000 -0.400000
v 0.400000 -0.000000 0.400000
v 0.400000 0.000000 -0.400000
v 0.400000 0.500000 0.300000
v 0.400000 0.500000 0.000000
v 0.400000 0.500000 -0.100000
v 0.400000 0.500000 -0.300000
v 0.400000 0.600000 0.400000
v 0.400000 0.600000 0.300000
v 0.400000 0.600000 0.000000
v 0.400000 0.600000 -0.100000
v 0.400000 0.600000 -0.300000
v 0.400000 0.600000 -0.400000
v 0.400000 0.800000 0.400000
v 0.400000 0.800000 -0.400000
v -0.300000 0.500000 0.400000
v -0.400000 0.600000 0.400000
v -0.400000 -0.000000 0.400000
v -0.300000 0.600000 0.400000
v -0.400000 0.800000 0.400000
v 0.000000 0.500000 0.400000
v 0.000000 0.600000 0.400000
v 0.100000 0.500000 0.400000
v 0.100000 0.600000 0.400000
v 0.300000 0.500000 0.400000
v 0.300000 0.600000 0.400000
v 0.400000 -0.000000 0.400000
v 0.400000 0.600000 0.400000
v 0.400000 0.800000 0.400000
v -0.400000 0.000000 -0.400000
v -0.400000 0.600000 -0.400000
v -0.300000 0.500000 -0.400000
v -0.400000 0.800000 -0.400000
v -0.300000 0.600000 -0.400000
v -0.100000 0.500000 -0.400000
v -0.100000 0.600000 -0.400000
v 0.000000 0.500000 -0.400000
v 0.000000 0.600000 -0.400000
v 0.300000 0.500000 -0.400000
v 0.300000 0.600000 -0.400000
v 0.400000 0.000000 -0.400000
v 0.400000 0.600000 -0.400000
v 0.400000 0.800000 -0.400000
v -0.400000 0.000000 -0.400000
v 0.400000 -0.000000 0.400000
v -0.400000 -0.000000 0.400000
v 0.400000 0.000000 -0.400000
v -0.400000 0.800000 0.400000
v 0.400000 0.800000 0.400000
v -0.400000 0.800000 -0.400000
v 0.400000 0.800000 -0.400000
v -0.400000 0.500000 0.300000
v -0.400000 0.000000 -0.400000
v -0.400000 -0.000000 0.400000
v -0.400000 0.500000 0.100000
v -0.400000 0.500000 0.000000
v -0.400000 0.500000 -0.300000
v -0.400000 0.600000 0.400000
v -0.400000 0.600000 0.300000
v -0.400000 0.600000 0.100000
v -0.400000 0.600000 0.000000
v -0.400000 0.600000 -0.300000
v -0.400000 0.600000 -0.400000
v -0.400000 0.800000 0.400000
v -0.400000 0.800000 -0.400000
v 0.400000 -0.000000 0.400000
v 0.400000 0.000000 -0.400000
v 0.400000 0.500000 0.300000
v 0.400000 0.500000 0.000000
v 0.400000 0.500000 -0.100000
v 0.400000 0.500000 -0.300000
v 0.400000 0.600000 0.400000
v 0.400000 0.600000 0.300000
v 0.400000 0.600000 0.000000
v 0.400000 0.600000 -0.100000
v 0.400000 0.600000 -0.300000
v 0.400000 0.600000 -0.400000
v 0.400000 0.800000 0.400000
v 0.400000 0.800000 -0.400000
v -0.300000 0.500000 0.400000
v -0.400000 0.600000 0.400000
v -0.400000 -0.000000 0.400000
v -0.300000 0.600000 0.400000
v -0.400000 0.800000 0.400000
v 0.000000 0.500000 0.400000
v 0.000000 0.600000 0.400000
v 0.100000 0.500000 0.400000
v 0.100000 0.600000 0.400000
v 0.300000 0.500000 0.400000
v 0.300000 0.600000 0.400000
v 0.400000 -0.000000 0.400000
v 0.400000 0.600000 0.400000
v 0.400000 0.800000 0.400000
v -0.400000 0.000000 -0.400000
v -0.400000 0.600000 -0.400000
v -0.300000 0.500000 -0.400000
v -0.400000 0.800000 -0.400000
v -0.300000 0.600000 -0.400000
v -0.100000 0.500000 -0.400000
v -0.100000 0.600000 -0.400000
v 0.000000 0.500000 -0.400000
v 0.000000 0.600000 -0.400000
v 0.300000 0.500000 -0.400000
v 0.300000 0.600000 -0.400000
v 0.400000 0.000000 -0.400000
v 0.400000 0.600000 -0.400000
v 0.400000 0.800000 -0.400000
v -0.400000 0.000000 -0.400000
v 0.400000 -0.000000 0.400000
v -0.400000 -0.000000 0.400000
v 0.400000 0.000000 -0.400000
v -0.400000 0.800000 0.400000
v 0.400000 0.800000 0.400000
v -0.400000 0.800000 -0.400000
v 0.400000 0.800000 -0.400000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.537109 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vt 0.904297 0.500000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -0.0000 -0.0000 1.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 1.0000 0.0000
usemtl palette
s 1
f 1/1/1 2/2/1 3/3/1
f 4/4/1 2/2/1 1/1/1
f 5/5/1 2/2/1 4/4/1
f 6/6/1 2/2/1 5/5/1
f 7/7/1 1/1/1 3/3/1
f 8/8/1 4/9/1 1/10/1
f 8/11/1 1/1/1 7/7/1
f 9/12/1 5/5/1 4/4/1
f 9/13/1 4/9/1 8/8/1
f 10/14/1 6/15/1 5/16/1
f 10/17/1 5/5/1 9/12/1
f 11/18/1 2/2/1 6/6/1
f 11/19/1 6/15/1 10/14/1
f 12/20/1 2/2/1 11/18/1
f 13/21/1 10/14/1 9/13/1
f 13/21/1 8/8/1 7/22/1
f 13/21/1 12/23/1 11/19/1
f 13/21/1 11/19/1 10/14/1
f 13/21/1 9/13/1 8/8/1
f 14/24/1 12/23/1 13/21/1
f 15/25/2 16/26/2 17/27/2
f 17/27/2 16/26/2 18/28/2
f 18/28/2 16/26/2 19/29/2
f 19/29/2 16/26/2 20/30/2
f 15/25/2 17/27/2 21/31/2
f 17/32/2 18/33/2 22/34/2
f 21/31/2 17/27/2 22/35/2
f 18/28/2 19/29/2 23/36/2
f 22/34/2 18/33/2 23/37/2
f 19/38/2 20/39/2 24/40/2
f 23/36/2 19/29/2 24/41/2
f 20/30/2 16/26/2 25/42/2
f 24/40/2 20/39/2 25/43/2
f 25/42/2 16/26/2 26/44/2
f 23/37/2 24/40/2 27/45/2
f 21/46/2 22/34/2 27/45/2
f 25/43/2 26/47/2 27/45/2
f 24/40/2 25/43/2 27/45/2
f 22/34/2 23/37/2 27/45/2
f 27/45/2 26/47/2 28/48/2
f 29/49/3 30/50/3 31/51/3
f 32/52/3 33/53/3 30/54/3
f 32/55/3 30/50/3 29/49/3
f 34/56/3 29/49/3 31/51/3
f 34/57/3 32/52/3 29/58/3
f 35/59/3 33/53/3 32/52/3
f 35/59/3 32/52/3 34/57/3
f 36/60/3 34/56/3 31/51/3
f 36/60/3 35/61/3 34/56/3
f 37/62/3 33/53/3 35/59/3
f 37/63/3 35/61/3 36/60/3
f 38/64/3 36/60/3 31/51/3
f 38/65/3 37/62/3 36/66/3
f 39/67/3 33/53/3 37/62/3
f 39/67/3 37/62/3 38/65/3
f 40/68/3 38/64/3 31/51/3
f 40/68/3 39/69/3 38/64/3
f 41/70/3 33/53/3 39/67/3
f 41/71/3 39/69/3 40/68/3
f 42/72/3 33/53/3 41/70/3
f 43/73/4 44/74/4 45/75/4
f 44/76/4 46/77/4 47/78/4
f 45/75/4 44/74/4 47/79/4
f 43/73/4 45/75/4 48/80/4
f 45/81/4 47/78/4 48/82/4
f 47/78/4 46/77/4 49/83/4
f 48/82/4 47/78/4 49/83/4
f 43/73/4 48/80/4 50/84/4
f 48/80/4 49/85/4 50/84/4
f 49/83/4 46/77/4 51/86/4
f 50/84/4 49/85/4 51/87/4
f 43/73/4 50/84/4 52/88/4
f 50/89/4 51/86/4 52/90/4
f 51/86/4 46/77/4 53/91/4
f 52/90/4 51/86/4 53/91/4
f 43/73/4 52/88/4 54/92/4
f 52/88/4 53/93/4 54/92/4
f 53/91/4 46/77/4 55/94/4
f 54/92/4 53/93/4 55/95/4
f 55/94/4 46/77/4 56/96/4
f 57/97/5 58/98/5 59/99/5
f 60/100/5 58/98/5 57/97/5
f 61/101/6 62/102/6 63/103/6
f 63/103/6 62/102/6 64/104/6
usemtl palette.001
f 65/105/1 66/106/1 67/107/1
f 68/108/1 66/106/1 65/105/1
f 69/109/1 66/106/1 68/108/1
f 70/110/1 66/106/1 69/109/1
f 71/111/1 65/105/1 67/107/1
f 72/112/1 68/113/1 65/114/1
f 72/115/1 65/105/1 71/111/1
f 73/116/1 69/109/1 68/108/1
f 73/117/1 68/113/1 72/112/1
f 74/118/1 70/119/1 69/120/1
f 74/121/1 69/109/1 73/116/1
f 75/122/1 66/106/1 70/110/1
f 75/123/1 70/119/1 74/118/1
f 76/124/1 66/106/1 75/122/1
f 77/125/1 74/118/1 73/117/1
f 77/125/1 72/112/1 71/126/1
f 77/125/1 76/127/1 75/123/1
f 77/125/1 75/123/1 74/118/1
f 77/125/1 73/117/1 72/112/1
f 78/128/1 76/127/1 77/125/1
f 79/129/2 80/130/2 81/131/2
f 81/131/2 80/130/2 82/132/2
f 82/132/2 80/130/2 83/133/2
f 83/133/2 80/130/2 84/134/2
f 79/129/2 81/131/2 85/135/2
f 81/136/2 82/137/2 86/138/2
f 85/135/2 81/131/2 86/139/2
f 82/132/2 83/133/2 87/140/2
f 86/138/2 82/137/2 87/141/2
f 83/142/2 84/143/2 88/144/2
f 87/140/2 83/133/2 88/145/2
f 84/134/2 80/130/2 89/146/2
f 88/144/2 84/143/2 89/147/2
f 89/146/2 80/130/2 90/148/2
f 87/141/2 88/144/2 91/149/2
f 85/150/2 86/138/2 91/149/2
f 89/147/2 90/151/2 91/149/2
f 88/144/2 89/147/2 91/149/2
f 86/138/2 87/141/2 91/149/2
f 91/149/2 90/151/2 92/152/2
f 93/153/3 94/154/3 95/155/3
f 96/156/3 97/157/3 94/158/3
f 96/159/3 94/154/3 93/153/3
f 98/160/3 93/153/3 95/155/3
f 98/161/3 96/156/3 93/162/3
f 99/163/3 97/157/3 96/156/3
f 99/163/3 96/156/3 98/161/3
f 100/164/3 98/160/3 95/155/3
f 100/164/3 99/165/3 98/160/3
f 101/166/3 97/157/3 99/163/3
f 101/167/3 99/165/3 100/164/3
f 102/168/3 100/164/3 95/155/3
f 102/169/3 101/166/3 100/170/3
f 103/171/3 97/157/3 101/166/3
f 103/171/3 101/166/3 102/169/3
f 104/172/3 102/168/3 95/155/3
f 104/172/3 103/173/3 102/168/3
f 105/174/3 97/157/3 103/171/3
f 105/175/3 103/173/3 104/172/3
f 106/176/3 97/157/3 105/174/3
f 107/177/4 108/178/4 109/179/4
f 108/180/4 110/181/4 111/182/4
f 109/179/4 108/178/4 111/183/4
f 107/177/4 109/179/4 112/184/4
f 109/185/4 111/182/4 112/186/4
f 111/182/4 110/181/4 113/187/4
f 112/186/4 111/182/4 113/187/4
f 107/177/4 112/184/4 114/188/4
f 112/184/4 113/189/4 114/188/4
f 113/187/4 110/181/4 115/190/4
f 114/188/4 113/189/4 115/191/4
f 107/177/4 114/188/4 116/192/4
f 114/193/4 115/190/4 116/194/4
f 115/190/4 110/181/4 117/195/4
f 116/194/4 115/190/4 117/195/4
f 107/177/4 116/192/4 118/196/4
f 116/192/4 117/197/4 118/196/4
f 117/195/4 110/181/4 119/198/4
f 118/196/4 117/197/4 119/199/4
f 119/198/4 110/181/4 120/200/4
f 121/201/5 122/202/5 123/203/5
f 124/204/5 122/202/5 121/201/5
f 125/205/6 126/206/6 127/207/6
f 127/207/6 126/206/6 128/208/6
纹理文件:
OBJ加载器:
package Voxel2.renderEngine;
import Voxel2.models.RawModel;
import org.lwjgl.util.vector.Vector2f;
import org.lwjgl.util.vector.Vector3f;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
public class OBJLoader {
public static RawModel loadObjModel(String fileName, Loader loader) {
FileReader fr = null;
try {
fr = new FileReader(new File("res/models/" + fileName + ".obj"));
} catch (FileNotFoundException e) {
System.err.println("Couldn't load model!");
e.printStackTrace();
}
BufferedReader reader = new BufferedReader(fr);
String line;
List<Vector3f> vertices = new ArrayList<>();
List<Vector2f> textures = new ArrayList<>();
List<Vector3f> normals = new ArrayList<>();
List<Integer> indices = new ArrayList<>();
float[] verticesArray = null;
float[] normalsArray = null;
float[] textureArray = null;
int[] indicesArray = null;
try {
while(true) {
line = reader.readLine();
String[] currentLine = line.split(" ");
if (line.startsWith("v ")) {
Vector3f vertex = new Vector3f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2]), Float.parseFloat(currentLine[3]));
vertices.add(vertex);
} else if (line.startsWith("vt ")) {
Vector2f texture = new Vector2f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2]));
textures.add(texture);
} else if (line.startsWith("vn ")) {
Vector3f normal = new Vector3f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2]), Float.parseFloat(currentLine[3]));
normals.add(normal);
} else if (line.startsWith("f ")) {
textureArray = new float[vertices.size() * 2];
normalsArray = new float[vertices.size() * 3];
break;
}
}
while (line != null) {
if (!line.startsWith("f ")) {
line = reader.readLine();
continue;
}
String[] currentLine = line.split(" ");
String[] vertex1 = currentLine[1].split("/");
String[] vertex2 = currentLine[2].split("/");
String[] vertex3 = currentLine[3].split("/");
processVertex(vertex1, indices, textures, normals, textureArray, normalsArray);
processVertex(vertex2, indices, textures, normals, textureArray, normalsArray);
processVertex(vertex3, indices, textures, normals, textureArray, normalsArray);
line = reader.readLine();
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
verticesArray = new float[vertices.size() * 3];
indicesArray = new int[indices.size()];
int vertexPointer = 0;
for (Vector3f vertex : vertices) {
verticesArray[vertexPointer++] = vertex.x;
verticesArray[vertexPointer++] = vertex.y;
verticesArray[vertexPointer++] = vertex.z;
}
for (int i = 0; i < indices.size(); i ++) {
indicesArray[i] = indices.get(i);
}
return loader.loadToVAO(verticesArray, textureArray, indicesArray);
}
private static void processVertex(String[] vertexData, List<Integer> indices, List<Vector2f> textures,
List<Vector3f> normals, float[] textureArray, float[] normalsArray) {
int currentVertexPointer = Integer.parseInt(vertexData[0]) - 1;
indices.add(currentVertexPointer);
Vector2f currentTex = textures.get(Integer.parseInt(vertexData[1]) -1);
textureArray[currentVertexPointer * 2] = currentTex.x;
textureArray[currentVertexPointer * 2 + 1] = 1- currentTex.y;
Vector3f currentNorm = normals.get(Integer.parseInt(vertexData[2]) - 1);
normalsArray[currentVertexPointer * 3] = currentNorm.x;
normalsArray[currentVertexPointer * 3 + 1] = currentNorm.y;
normalsArray[currentVertexPointer * 3 + 2] = currentNorm.z;
}
}
渲染器:
package Voxel2.renderEngine;
import Voxel2.models.RawModel;
import Voxel2.models.TexturedModel;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import org.lwjgl.util.vector.Matrix4f;
import Voxel2.shaders.StaticShader;
import Voxel2.toolbox.Maths;
import Voxel2.entities.Entity;
public class Renderer {
private static final float FOV = 70;
private static final float NEAR_PLANE = 0.1f;
private static final float FAR_PLANE = 1000;
private Matrix4f projectionMatrix;
public Renderer(StaticShader shader){
createProjectionMatrix();
shader.start();
shader.loadProjectionMatrix(projectionMatrix);
shader.stop();
}
public void prepare() {
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
GL11.glClearColor(0.3f, 0.3f, 0.3f, 1);
}
public void render(Entity entity, StaticShader shader) {
TexturedModel model = entity.getModel();
RawModel rawModel = model.getRawModel();
GL30.glBindVertexArray(rawModel.getVaoID());
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
Matrix4f transformationMatrix = Maths.createTransformationMatrix(entity.getPosition(),
entity.getRotX(), entity.getRotY(), entity.getRotZ(), entity.getScale());
shader.loadTransformationMatrix(transformationMatrix);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, model.getTexture().getID());
GL11.glDrawElements(GL11.GL_TRIANGLES, rawModel.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL30.glBindVertexArray(0);
}
private void createProjectionMatrix(){
float aspectRatio = (float) Display.getWidth() / (float) Display.getHeight();
float y_scale = (float) ((1f / Math.tan(Math.toRadians(FOV / 2f))) * aspectRatio);
float x_scale = y_scale / aspectRatio;
float frustum_length = FAR_PLANE - NEAR_PLANE;
projectionMatrix = new Matrix4f();
projectionMatrix.m00 = x_scale;
projectionMatrix.m11 = y_scale;
projectionMatrix.m22 = -((FAR_PLANE + NEAR_PLANE) / frustum_length);
projectionMatrix.m23 = -1;
projectionMatrix.m32 = -((2 * NEAR_PLANE * FAR_PLANE) / frustum_length);
projectionMatrix.m33 = 0;
}
}
片段着色器:
#version 150
in vec2 pass_textureCoordinates;
out vec4 out_Color;
uniform sampler2D modelTexture;
void main(void){
out_Color = texture(modelTexture,pass_textureCoordinates);
}
顶点着色器:
#version 150
in vec3 position;
in vec2 textureCoordinates;
out vec2 pass_textureCoordinates;
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
void main(void){
gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(position,1.0);
pass_textureCoordinates = textureCoordinates;
}
解决方案
推荐阅读
- python - 仅使用 OpenSSL 解密在 Python 中加密的文件
- html - 无法使用 Pro 许可证在占位符中显示 Font Awesome 灯图标
- c++ - 斐波那契数列更快,但起始数字不同 (F[n]=F[n-1]+F[n-2])
- python - 随着时间的推移,Django 查询会变慢
- java - 从匿名嵌套内部类更改局部变量
- python - 一类svm python中的异常行为
- reactjs - 'constructor' 和 'super' 上的 React vs Redux 道具
- c++ - 具有 Fluent 接口的 C++ Builder 模式
- javascript - 使用 simpleTones.js 将用户输入作为频率
- ios - 使用 gstreamer 通过网络将 ARFrame CVPixelBuffer 作为字节数组发送时崩溃