PDA

View Full Version : Discuss anything related to OpenGL technique, come on...



CrazyBabe
15-10-2003, 23:27
Hẹ hẹ, hôm nay tôi viết thêm một modul fake shadow cho chương trình của mình, đơn giản chỉ là áp một cái texture bóng tròn lên terrain thui :> kô có gì ghê gớm cả. Ban đầu là tui đổ vector crossing lên để lấy mesh cần vẽ, sau đó là cứ thế mà vẽ thui >> hix, chít cha, seo thằng này bị xé hình kì cục zị T_T, rõ ràng mình để depth test là LEQUAL rùi mờ ???? Hic, tui đoán là do depth buffer kô đủ chỗ chứa nên là thèng này kô vẽ chính xác được, mà bỏ depth mask thì cũng kô xong. Cáu wé.. lúc đầu định lục xem OpenGL có hỗ trợ cái hint nào để khắc phục chất lượng ảnh trong những trường hợp này kô (ủa wên, cái này tôi test trên một card GF4 MX440 thì mới bị, các card GF4 dòng Ti kô có card nào bị thế này hết, hè hè...) hoặc định tăng kích thước depth buffer lên (stupid ideal +_+) nhưng mờ kô có thời gian+chả có quyển sách reference nào, hic >> ra đi thanh thản.
Nhăn mẹt suy nghĩ 5 phút, làm ly cafe cho tỉnh táo, cuối cùng tui quyết định áp dùng một cách con nhà lừa, hẹ hẹ. Tui đẩy độ cao của mesh đó lên một mức nhỏ vừa đủ để lỗi kô xảy ra đồng thời hiệu quả hình ảnh kô bị biến dạng quá mức....hic hic.... may mà gõ phát ăn ngay.... xong ... chỉ có điều cách giải quyết này kô trọn vẹn lắm. Do trong game tôi viết góc quay hầu như luôn cao hơn những mesh này nên cũng khó nhận ra, nhưng trong những trường hợp khác ?
Trường hợp này đa số các game chạy OpenGL viết khoảng 1 năm về trước đều bị. Giống như haftlife khi nhìn ở xa thì thường bị mất correct chẳng hạn. Nhưng hiện tại HL2 và DoomIII đều đã khử được những lỗi này (hic, tại zề nó kô chơi với con card GF MX chứ nếu chạy thì chắc vẫn chết). Vì thế tôi muốn thảo luận thêm một chút, các huynh đệ chắc là có người làm cái này rùi, vì thế có cách nào tốt hơn thì show ra (hẹ hẹ, đỡ phải tìm :>).
Tôi nghĩ là còn một cách nữa (làm rùi) là dùng TEXTURE_LAYER, nhưng hic, cái chính là mình viết mà kô chạy được trên những card thông thường thì... tiêu. Chứ viết mà cứ yêu cầu vống lên thì chuối quá.
Ảnh lởm:
http://genetic.vngate.net/diendan/attachments/00000000450/Screen0021.jpg
Ảnh sau khi "phẫu thuật":
http://genetic.vngate.net/diendan/attachments/00000000450/Screen0022.jpg
To be continue....

Mach2
16-10-2003, 09:40
Ko biết cái này có phải là cái hiện tượng z-fighting ko nhể? Hồi trước lúc mình làm cái FS cũng bị cái này. Hồi đó test cũng cao lắm là GF4MX nên ko biết là mấy thằng Ti thì ko bị, hehe. Bạn làm nhiều bóng như thế thì thể nào cũng bị cái này thôi.
http://www.sgi.com/software/opengl/advanced98/notes/node243.html#SECTION000162000000000000000
Theo bài này thì có thể dùng stencil buffer để sửa đuợc lỗi này, nhưng mà cách này ko hay lắm vì chỉ chạy tốt trên 32bit màu thôi. Mình nghĩ còn cách khác là sort thứ tự để vẽ shadow, hay tắt luôn depth test đi để vẽ (đương nhiên phải vẽ trước khi vẽ mấy thằng lính chạy lăng nhăng rồi).
Cách của bạn cũng hay đó nhưng đúng là phải đặt góc nhìn của camera cao cao chứ ko thì chuối thật. Hồi trước mình cũng thử cách này mà góc nhìn ko hạn chế nên nhìn thấy ngáo kinh!!! hehe ;)

gtechvn
20-10-2003, 11:13
Hi Craze,

Bạn thử cách này nhé :

Disable depth test
Vẽ cái bóng của bạn
Enable depth test

Còn dùng stencil buffer thì chắc chắn không sửa được vì stencil chỉ là kỹ thuật đánh dấu mà thôi
Thân
gtechvn

gtechvn
20-10-2003, 11:19
Quên nữa, Craze cho hỏi một câu, làm thế nào để post mấy tấm hình lên forum này như cậu vậy
(he he một câu hỏi ngớ ngẩn)
Thân
gtechvn

CrazyBabe
20-10-2003, 22:51
Hi hi, tôi link ảnh từ site khác sang đấy.
Dùng depth stencil chắc chắn là được (tui dùng rùi mừ+tutor đầy rấy) chỉ có điều là chậm lắm, kô realtime được cho vô số đối tượng như ct của tôi được mô. Giải pháp tắt depth buffer rùi vẽ chắc chắn là kô dùng được (deep thinking about that thing ? right ?)
He he, Mach2 ui, tui tìm ra cách tăng tốc rùi, kô cần bật stencil checking mà chỉ cần bật stencil correct là ổn. hí hí, nhưng mà tốc độ vẫn giảm thảm hại. Hè hè, chắc là vẫn theo lối cũ thui.

gtechvn
06-11-2003, 11:34
Nếu card của bạn có hỗ trợ stencil buffer thì chắc chắn tốc độ không thể thảm hại được. Mình đã từng làm một chương trình về bóng realtime (planar shadow, shadow volume, và projective mapping shadow) trong một thế giới tương đối lớn trong đó mình dùng stencil để giới hạn vùng bóng , tốc độ OK (Card Geforce II - 64 MB).
Bạn có thể post đoạn code đó lên ko?

CrazyBabe
21-11-2003, 02:19
Hi, hôm nay mới đọc bài này (?), code mình chưa up được vì máy tính đang có vấn đề (hic), nhưng nói chung là chậm lém...mà card của mình cũng thuộc loại có hỗ trợ stencil buffer mà (GF4MX440). Chỉ có điều là chậm thui, chưa thử thế giới lớn, chỉ cần áp nó vào một face hoặc room là đủ chít rùi.

Zelda
10-03-2004, 02:38
Bác Crazy dùng chương trình mà có ngôn ngữ OpenGL để lập trình game vậy ?

mo dung phuc
06-05-2004, 00:43
zelda hỏi gì thế, chả hiểu gì cả
nếu hỏi ngôn ngữ nào thì nó là C++

sickle_cell
05-08-2004, 18:20
Nếu card của bạn có hỗ trợ stencil buffer thì chắc chắn tốc độ không thể thảm hại được. Mình đã từng làm một chương trình về bóng realtime (planar shadow, shadow volume, và projective mapping shadow) trong một thế giới tương đối lớn trong đó mình dùng stencil để giới hạn vùng bóng , tốc độ OK (Card Geforce II - 64 MB).
Bạn có thể post đoạn code đó lên ko?

Mình bít hình như bi giờ người ta chơi thim một cái là Raytrace shadow ??? (hông chắc nhe)

Volume shadow thuộc hàng top ten rùi. wa.. có code hông share đêeeee . Giấu nghề làm chi :-D

Mach2
06-08-2004, 04:58
"raytrace shadow" in raytracing renderer? uh-oh

sickle_cell
06-08-2004, 05:50
"raytrace shadow" in raytracing renderer? uh-oh

uh uh, tính code cái nèy nè nhưng mà máy chậm we' ngồi debug hổng nổi.

huykhoi
28-09-2004, 15:22
Tớ đang muốn học về openGL trong C++ hoặc trong VB cũng được, các bạn có thể chỉ cho mình ở đâu có sách hướng dẫn về openGL được không?
Mình cảm ơn rất nhiều.

whitepenguin
23-08-2005, 03:11
Các bạn cho hỏi cái này tí
Tui có 1 đoạn mã về OPENGL như sau:
#include <gl/glut.h>
#include <math.h>

void Render()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glPushMatrix();
glRotatef(-20,1,0,0);
glBegin(GL_TRIANGLES);
glColor3f(0,0,1);
glVertex3f(0,-20,1);
glVertex3f(20,20,1);
glVertex3f(-20,20,1);

glColor3f(0,1,0);
glVertex3f(0,0,0);
glVertex3f(-20,-20,0);
glVertex3f(20,-20,0);

glEnd();
glPopMatrix();
glFlush();
}

void Change(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
float k=float(w)/float(h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-100*k,100*k,-100,100,100,-100);
else
glOrtho(-100,100,-100/k,100/k,100,-100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void main()
{
glutInitDisplayMode(GLUT_SINGLE);
glutCreateWindow("Simple");
glShadeModel(GL_FLAT);
glutDisplayFunc(Render);
glutReshapeFunc(Change);
glutMainLoop();
}

Trong hàm Render();
Cái triangle đầu tiên nó nằm trong mặt phằng z=1 có màu xanh da trời và cái triangle tiếp theo màu xanh lá nằm trong mặt phằng z=0;
Cậu hòi như thế này .Tại sao khi vẽ ra màn hình cái triangle màu xanh da trời nó lại nằm dưới cái màu xanh lá mà trong khi đó tui đã enable Depth Test rồi
Mình nhìn từ trên trục z thằng xuống mặt phằng XOY thì tất nhiên cái Z=1 phải nằm trên chứ ,sao nó lại làm ngược lại là sao

poly
23-08-2005, 07:22
if(w<=h)
glOrtho(-100*k,100*k,-100,100,100,-100);
else
glOrtho(-100,100,-100/k,100/k,100,-100);


abcdefghijklmnoprstu

whitepenguin
23-08-2005, 11:40
gì thế ,có gì sai đâu ha bạn???

whitepenguin
24-08-2005, 11:08
Vậy là coi như kô ai bít về việc này àh :D

poly
24-08-2005, 21:33
bó tay bác luôn, chỉ thế mà còn ko tự tìm được chỗ sai.
Bác cho znear với zfar giá trị như thế thì tất cả z đều bị đổi dấu. Bác xem cái matrix tạo bởi hàm Ortho là biết. Fix -> swap 2 giá trị đó lại.
Bác lười quá đấy.

whitepenguin
16-09-2005, 11:17
Cho hỏi tí mí bác

cho matrix M
| Ux | Vx | Nx | Tx |
| Uy | Vy | Ny |Ty |
| Uz | Vz | Nz | Tz |
| 0 | 0 | 0 | 1 |

U V N la` vector cơ sở
T là Vector Transpase
Tui đọc trong sách OpenGL nó nói cách Transform 1 vertex P như sau
P' =M * P;
Theo cách này P sẽ được chuyển đổi sang tọa độ Eye và dịch chuyển theo T

Nhưng mà cho hỏi cái nè
M* P thì nó sẽ lấy Từng hàng của Matrix M nhân cho Vertex P
Vídu hàng dầu tiên là (Ux V x Nx Tx ) *P và cộg cách kết quả nhân lại
vậy nếu làm như thế thì biến đổi sai cơ sơ rồi
Tại vì cơ sở mới cho Px là Ux Uy Uz mới đúng ,còn đàng này nó lại lấy Ux Vx Nx nhânvô ,vậy sai bét rồi còn gì??

poly
16-09-2005, 13:33
U V N la` vector cơ sở
T là Vector Transpase
Tui đọc trong sách OpenGL nó nói cách Transform 1 vertex P như sau
P' =M * P;
Theo cách này P sẽ được chuyển đổi sang tọa độ Eye và dịch chuyển theo T

Nhưng mà cho hỏi cái nè
M* P thì nó sẽ lấy Từng hàng của Matrix M nhân cho Vertex P
Vídu hàng dầu tiên là (Ux V x Nx Tx ) *P và cộg cách kết quả nhân lại
vậy nếu làm như thế thì biến đổi sai cơ sơ rồi
Tại vì cơ sở mới cho Px là Ux Uy Uz mới đúng ,còn đàng này nó lại lấy Ux Vx Nx nhânvô ,vậy sai bét rồi còn gì??


Bác viết mấy cái UVNT là cái gì vậy? P là vector hay basis? Sai là sai chổ nào?
Bác nhân cái ma trận đó cho basis [1,0,0,1], [0,1,0,1] hay [0,0,1,1] thử coi sai là sai chỗ nào?
Hu hu oe oe

tiendolax
21-11-2011, 17:43
upppppppppppppppppppppppppppppppppppppppppppppppp

tiendolax
21-11-2011, 17:44
uppppppppppppppppppppppppppppppppppppp

tiendolax
21-11-2011, 17:46
uppppppppppppppppppppppppppppppppppppppppppppppppp ppppppppppppp