Welcome Guest (
ავტორიზაცია
|
რეგისტრაცია
)
ვალიდაციის წერილის ხელახალი გაგზავნა
წესები
·
დახმარება
·
ძებნა
·
წევრები
·
კალენდარი
·
რჩეულები
·
ჩატი
თბილისის ფორუმი
->
ტექნიკური კონფერენცია
->
პროგრამირება
->
System/Graphic Programming
გამოხმაურება
·
ახალი თემა
·
ახალი გამოკითხვა
Pages:
(36)
« პირველი
...
4
5
[6]
7
8
...
ბოლო »
(
გადავიდეთ პირველ წაუკითხავ წერილზე
)
ვსწავლობთ OpenGL-ს
, ალ ვილქომენ
მივიღოთ შეტყობინება ამ თემის განახლების შესახებ
·
გაუგზავნეთ ეს გვერდი სხვას
·
ამოსაბეჭდი ვერსია
|
თემის რჩეულებში დამატება/წაშლა
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
ეზეკი
11000
ჯგუფი: Members
ეზეკი
11000
ჯგუფი: Members
წერილები: 2099
წევრი No.: 7569
რეგისტრ.: 30-November 04
#4073529
· 1 Nov 2006, 19:13 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
MOLA
საიდან და იდეები და ვსიო მეტი არაფერი არ არის ეს, დანარჩენს ნახულობ მაგალითში როგორც არის გაკეთებული და ისე აკეთებ.
shota_pixela
საღოლ მაგარია :)
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4074077
· 1 Nov 2006, 20:39 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
აი მალადეც :)
აქაც დავწერ 1-2 რამეს ხოლმე და დაამუღამეთ.
ლისტები იყო ნახსენები ლექციაზე. აი როგორ უნდა გამოიყენოთ.
ასე ხდება ახალი ლისტის შექმნის წინ უნიკალური იდენტიფიკატორი დაგენერირება:
int listID = glGenLists(1);
თუ მოხდა ისე რომ სისტემამ ვერშექმნა ახალი ლისტი იდენტიფიქატორი იქნება 0-ის ტოლი.
ამის შემდეგ პროგრამის ინიციალიზაციისას შეგიძლიათ უკვე კონკრეტული ლისტის შექმნა.
glNewList(listID,GL_COMPILE);
პირველი არის დაგენერირებული იდენტიფიკატორი. მეორე პარამეტრი მიუთითებს რომ დაამუშავოს შეტანილი ინფორმაცია. თუ მეორე პარამეტრი არის GL_COMPILE_AND_EXECUTE, დამუშავების მერე ეგრევე მოხდება შესრულებაც.
ამის მერე შეგვყავს სიის ინფორმაცია. მაგალიტად გეომეტრიული ინფორმაცია. მობრუნებები და ასე შემდეგ.
შეტანის დასრულებაზე მიუთითებს
glEndList();
პროგრამაში რენდერის დროს სადაც მოგვინდება ამ სიის ინფორმაციის გამოტანა უბრალოდ დავწერთ:
glCallList(listID);
სადემონსტრაციო პროგრამა:
CODE
#include "stdafx.h"
GLuint listName;
static void init (void)
{
listName = glGenLists (1);
glNewList (listName, GL_COMPILE);
glColor3f (1.0, 0.0, 0.0); /* current color red */
glBegin (GL_TRIANGLES);
glVertex2f (0.0, 0.0);
glVertex2f (1.0, 0.0);
glVertex2f (0.0, 1.0);
glEnd ();
glTranslatef (1.5, 0.0, 0.0); /* move position */
glEndList ();
glShadeModel (GL_FLAT);
}
static void drawLine (void)
{
glBegin (GL_LINES);
glVertex2f (0.0, 0.5);
glVertex2f (15.0, 0.5);
glEnd ();
}
void display(void){
GLuint i;
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (0.0, 1.0, 0.0); /* current color green */
for (i = 0; i < 10; i++) /* draw 10 triangles */
glCallList (listName);
drawLine (); /* is this line green? NO! */
/* where is the line drawn? */
glFlush ();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
gluOrtho2D (0.0, 2.0, -0.5 * (GLfloat) h/(GLfloat) w,
1.5 * (GLfloat) h/(GLfloat) w);
else
gluOrtho2D (0.0, 2.0 * (GLfloat) w/(GLfloat) h, -0.5, 1.5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
}
}
/* Main Loop
* Open window with initial window size, title bar,
* RGBA display mode, and handle input events.
*/
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(650, 50);
glutCreateWindow("List");
init ();
glutReshapeFunc (reshape);
glutDisplayFunc (display);
glutKeyboardFunc (keyboard);
glutMainLoop();
return 0;
}
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
shota_pixela
Expert
ჯგუფი: Registered
shota_pixela
Expert
ჯგუფი: Registered
წერილები: 1065
წევრი No.: 19190
რეგისტრ.: 11-April 06
#4078227
· 2 Nov 2006, 14:01 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
მადლობთ. ვცდილობ რა. :P
მაგარი რამე დაუწერია abnormalias . მაგის დამუღამებას ვიწყებ.
ცოტა ჩავასწორე snake
This post has been edited by
shota_pixela
on 2 Nov 2006, 14:07
მიმაგრებული ფაილი ( Number of downloads: 84 )
snake.zip
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4078968
· 2 Nov 2006, 15:37 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
QUOTE
(shota_pixela @ 2 Nov 2006, 14:01 )
მადლობთ. ვცდილობ რა. :P
მაგარი რამე დაუწერია abnormalias . მაგის დამუღამებას ვიწყებ.
ცოტა ჩავასწორე snake
ძალიან კარგია, ერთი შენიშვნა უბრალოდ. ეხლა ეს მიბმულია კადრების რაოდენობაზე და გადახატვაც ამ სიხშირით ხდება და ჩემთან მაგალითად ძალიან სწრაფად დარბის. უნდა მოიფიქრო და ისე ამოძრავო/გადახატო "სნეიკი" რომ ყველანაერ კომპიუტერზე დაახლოებით ერთი სიჩქარით მოძრაობდეს ;)
დრო ბევრნაერად შეგიძლია აიღო, მაგალითად ვინდოუსში ასე შეიძლება:
#include <mmsystem.h>
...
static double dStartTime = timeGetTime();
float fElpasedAppTime = (float)((timeGetTime() - dStartTime) * 0.001);
* * *
თუ წვეროების თითო-თითო ხელით შეტანა მოგბეზრდათ ( :gigi: )
შეგიძლიათ გამოიყენოთ მეორე შეტანის მეთოდი.
მაგალითი, 1 კვადის დახატვა მასივების გამოყენებით:
ასე აღიწერება მონაცემები
CODE
struct Vertex
{
// GL_C3F_V3F
float r,g,b;
float x, y, z;
};
Vertex g_quadVertices[] = {
{ 1.0f,0.0f,0.0f, -1.0f,-1.0f, 0.0f },
{ 1.0f,0.0f, 0.0f, 1.0f,-1.0f, 0.0f },
{ 1.0f,1.0f, 0.0f, 1.0f, 1.0f, 0.0f },
{ 0.0f,1.0f,1.0f, -1.0f, 1.0f, 0.0f }
};
ანუ აქ პრაქტიკულად შეგიძლიათ გამოცხადოთ თითქმის ნებისმიერი ფორმატის მასივი. ამ მაგალითში მასივი შეიცავს ინფორმაციას ფერებზე და წვეროებზე.
ამის რენდერი ხდება შემდეგნერად:
CODE
glInterleavedArrays( GL_C3F_V3F, 0, g_quadVertices );
glDrawArrays( GL_QUADS, 0, 4 );
ან მაგალითად წვეორები ერთ მასივში გქონდეთ და გამოიყენოთ
CODE
GLuint indices[4] = {0, 1, 3, 4};
glDrawElements (GL_POLYGON, 4, GL_UNSIGNED_INT, indices);
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4084435
· 3 Nov 2006, 11:56 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
კუბის ხატვა შერეული მასივებით
CODE
struct Vertex
{
// GL_C3F_V3F
float r, g, b;
float x, y, z;
};
წვეროების+ფერების მონაცემების აღწერა:
CODE
Vertex g_cubeVertices_indexed[] =
{
{ 1.0f,0.0f,0.0f, -1.0f,-1.0f, 1.0f }, // 0
{ 0.0f,1.0f,0.0f, 1.0f,-1.0f, 1.0f }, // 1
{ 0.0f,0.0f,1.0f, 1.0f, 1.0f, 1.0f }, // 2
{ 1.0f,1.0f,0.0f, -1.0f, 1.0f, 1.0f }, // 3
{ 1.0f,0.0f,1.0f, -1.0f,-1.0f,-1.0f }, // 4
{ 0.0f,1.0f,1.0f, -1.0f, 1.0f,-1.0f }, // 5
{ 1.0f,1.0f,1.0f, 1.0f, 1.0f,-1.0f }, // 6
{ 1.0f,0.0f,0.0f, 1.0f,-1.0f,-1.0f }, // 7
};
ინდექსების აღწერა:
CODE
GLubyte g_cubeIndices[] =
{
0, 1, 2, 3, // Quad 0
4, 5, 6, 7, // Quad 1
5, 3, 2, 6, // Quad 2
4, 7, 1, 0, // Quad 3
7, 6, 2, 1, // Quad 4
4, 0, 3, 5 // Quad 5
};
რენდერი
CODE
glInterleavedArrays( GL_C3F_V3F, 0, g_cubeVertices_indexed );
glDrawElements( GL_QUADS, 24, GL_UNSIGNED_BYTE, g_cubeIndices );
ანუ სად ადრე 24 წერტილის აღწერა გვიწევდა (აქედან უმეტესობა მეორდებოდა) კუბის დასახატავად. ეხლა 8 წვერო + ინდექსები და კუბი მზადაა :)
This post has been edited by
Abnormalia
on 3 Nov 2006, 12:04
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4096871
· 5 Nov 2006, 13:21 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
მოკლედ წინა ლექციაზე გავიარეთ განათება OPENGL-ში. აქ განათება რა თქმა უნდა არის მოდელი, აპროქსიმაცია. OPENGL-ში გამოიყენება ფონგის განათების მოდელი. განათების წყარო გამოასხივებს 3 ძირითად RGB(წითელი, მწვანე, ლურჯი). სცენის ობიექტის განათებაში თავისი წილი შეაქვთ შემდეგ კომპონენტებს:
1. ესაა Ambient კომპონენტი:
ესაა გაფანტული შუქი რომელიც ყველა მხრიდან მოდის.
(IMG:
http://www.falloutsoftware.com/tutorials/gl/amb1.jpg
)
მარტო ამ კომპონენტით განათებული 3D ობიექტი გამოიყურება როგორც 2D და შეფერადებული.
2. Diffuse კომპონენტი:
(IMG:
http://www.falloutsoftware.com/tutorials/gl/diffuse0.jpg
)
ამ დროს უკვე ითვალისწინება სინათლის წყაროს მიმართულება და გასანათებელი ობიექტი ემსავსება 3D-ს.
დაბლა სურათზე წარმოდგენელია სფერო:
ჯერ მარტო ამბიენტით და მერე დიფუზიური განათებით:
(IMG:
http://www.falloutsoftware.com/tutorials/gl/amb2.jpg
)(IMG:
http://www.falloutsoftware.com/tutorials/gl/diffuse1.jpg
)
3. Specular კომპონენტი:
(IMG:
http://www.falloutsoftware.com/tutorials/gl/spec1.jpg
)
აქ სინათლის წყაროს მიმართულების გარდა გაითვალისწინება ობიექტის ზედაპირის გაპრიალებულობა და ხედვის ვექტორის კუთხეც. დიფუზიური კომპონენტისგან განსხვავებით(დიფუზიურის დროს თანამრად ხდება გაფანტვა ყველა მიმართულებით) აქ არეკვლისას დაცემის კუთხე არეკვლის კუთხის ტოლია. ანუ გაპრიალებული ზედაპირზე სპეკულარული სინათლის კომპონენტი მეტ წილს შეიტანს, და პირიქით მაგალითად ხალიჩის განათებაზე საერთოდ არ იმოქმედებს სპეკულარული კომპონენტი.
4. Emissive კომპონენტი
(IMG:
http://www.falloutsoftware.com/tutorials/gl/emisGreen.jpg
)
აქ განათების წყარო თვითონ ობიექტია. ანუ ობიექტი გამოსხივებს სინათლეს.
საბოლოო განათება ითვლება როგორ ამ 4 კომპონენტის ერთობლიობა
L
total
= L
amb
+ L
spec
+ L
diff
+ L
em
This post has been edited by
Abnormalia
on 5 Nov 2006, 13:25
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4096939
· 5 Nov 2006, 13:31 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
ეხლა ვნახოთ კონკრეტულად როგორ ხდება OPENGL-ში სინათლის მოდელირება:
1. რაც უნდა ვქნათ ჩვენ უნდა "ჩავრთოთ" განათება. ამის მერე სცენის განათებას ჩვენ საკუთარ თავზე ვიღებთ.
glEnable(GL_LIGHTING);
2. უნდა დავაყენოთ განათების წყაროს თვისებები
glLightfv (ვექტორ პარამეტრებისთვის) glLightf(სკალარულ პარამეტრებისთვის) საშუალებით:
CODE
//ამბიენ კომპონენტას მნიშვნელობები
GLfloat ambient[] = { 0.3, 0.3, 0.3, 1.0 };
//დიფუზიური...
GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
//სპეკულარული
GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
//სინათლის წყაროს პოზიცია (x,y,z) კოორდინატები
GLfloat light_position[] = { 0.0, 5.0, 2.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
სინათლის წყაროები გადანომრილია როგორც LIGHT0, LIGHT1...
3. გაჩუმებით ყველა წყარო გამორთულია. ამიტომ შემდეგი რაც უნდა ვქნათ ესაა უნდა ჩავრთოთ სინათლის წყარო. შეიძლება რამოდენიმე სინათლის წყაროც გვქონდეს ერთად.
glEnable(GL_LIGHT0);
ავანთეთ შუქი სცენაზე. ;)
ეხლა საჭიროა კონკრეტულ ობიექტებს დავუნიშნოთ კონკრეტული მატერიალები:
ქცემოთ მოცემულია ზოგიერთ მატერიალების პარამეტრების სია:
CODE
Material
GL_AMBIENT
GL_DIFFUSE
GL_SPECULAR
GL_SHININESS
Brass
(0.329412, 0.223529, 0.027451, 1.0)
(0.780392, 0.568627, 0.113725, 1.0)
(0.992157, 0.941176, 0.807843, 1.0)
27.8974
Bronze
(0.2125, 0.1275, 0.054, 1.0)
(0.714, 0.4284, 0.18144, 1.0)
(0.393548, 0.271906, 0.166721, 1.0)
25.6
Polished Bronze
(0.25, 0.148, 0.06475, 1.0)
(0.4, 0.2368, 0.1036, 1.0)
(0.774597, 0.458561, 0.200621, 1.0)
76.8
Chrome
(0.25, 0.25, 0.25, 1.0)
(0.4, 0.4, 0.4, 1.0)
(0.774597, 0.774597, 0.774597, 1.0)
76.8
Copper
(0.19125, 0.0735, 0.0225, 1.0)
(0.7038, 0.27048, 0.0828, 1.0)
(0.256777, 0.137622, 0.086014, 1.0)
12.8
Polished Copper
(0.2295, 0.08825, 0.0275, 1.0)
(0.5508, 0.2118, 0.066, 1.0)
(0.580594, 0.223257, 0.0695701, 1.0)
51.2
Gold
(0.24725, 0.1995, 0.0745, 1.0)
(0.75164, 0.60648, 0.22648, 1.0)
(0.628281, 0.555802, 0.366065, 1.0)
51.2
Polished Gold
(0.24725, 0.2245, 0.0645, 1.0)
(0.34615, 0.3143, 0.0903, 1.0)
(0.797357, 0.723991, 0.208006, 1.0)
83.2
Pewter
(0.105882, 0.058824, 0.113725, 1.0)
(0.427451, 0.470588, 0.541176, 1.0)
(0.333333, 0.333333, 0.521569, 1.0)
9.84615
Silver
(0.19225, 0.19225, 0.19225, 1.0)
(0.50754, 0.50754, 0.50754, 1.0)
(0.508273, 0.508273, 0.508273, 1.0)
51.2
Polished Silver
(0.23125, 0.23125, 0.23125, 1.0)
(0.2775, 0.2775, 0.2775, 1.0)
(0.773911, 0.773911, 0.773911, 1.0)
89.6
Emerald
(0.0215, 0.1745, 0.0215, 0.55)
(0.07568, 0.61424, 0.07568, 0.55)
(0.633, 0.727811, 0.633, 0.55)
76.8
Jade
(0.135, 0.2225, 0.1575, 0.95)
(0.54, 0.89, 0.63, 0.95)
(0.316228, 0.316228, 0.316228, 0.95)
12.8
Obsidian
(0.05375, 0.05, 0.06625, 0.82)
(0.18275, 0.17, 0.22525, 0.82)
(0.332741, 0.328634, 0.346435, 0.82)
38.4
Pearl
(0.25, 0.20725, 0.20725, 0.922)
(1.0, 0.829, 0.829, 0.922)
(0.296648, 0.296648, 0.296648, 0.922)
11.264
Ruby
(0.1745, 0.01175, 0.01175, 0.55)
(0.61424, 0.04136, 0.04136, 0.55)
(0.727811, 0.626959, 0.626959, 0.55)
76.8
Turquoise
(0.1, 0.18725, 0.1745, 0.8)
(0.396, 0.74151, 0.69102, 0.8)
(0.297254, 0.30829, 0.306678, 0.8)
12.8
Black Plastic
(0.0, 0.0, 0.0, 1.0)
(0.01, 0.01, 0.01, 1.0)
(0.50, 0.50, 0.50, 1.0)
32.0
Black Rubber
(0.02, 0.02, 0.02, 1.0)
(0.01, 0.01, 0.01, 1.0)
(0.4, 0.4, 0.4, 1.0)
10.0
This post has been edited by
Abnormalia
on 5 Nov 2006, 13:37
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4097023
· 5 Nov 2006, 13:45 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
მოკლედ, სანამ რაიმე ობიექტს დავხატავთ რომელსაც გვინდა რამე კონკრეტული მატერიალი დავუნიშნოთ, საჭიროა პარამეტრების დაყენება შემდეგნაერად. მაგალითად ავიღოთ ზემოთ მოყვანილი სიიდან:
Polished Copper
CODE
GL_AMBIENT (0.2295, 0.08825, 0.0275, 1.0)
GL_DIFFUSE (0.5508, 0.2118, 0.066, 1.0)
GL_SPECULAR (0.580594, 0.223257, 0.0695701, 1.0)
GL_SHININESS 51.2
შესაბამისი კოდი იქნება:
CODE
GLfloat mat_ambient[] = { 0.2295, 0.08825, 0.0275, 1.0};
GLfloat mat_diffuse[] = { 0.5508, 0.2118, 0.066, 1.0};
GLfloat mat_specular[] = { 0.580594, 0.223257, 0.0695701, 1.0};
GLfloat mat_emission[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat mat_Shininess = 51.2;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
glMaterialf(GL_FRONT, GL_SHININESS, mat_Shininess);
ამის მერე დახატული ობიექტი იქნება შეფერადებული შესაბამისად.
გასათვალისწინებელია ერთი უმნიშვნელოვანესი რამე:
როგორ ვიცით OPENGL-ს განათების გამოსათვლელად ჭირდება ნორმალები. თუ ობიექტი "ხელითაა" გაკეთებული მას როგორ წესი ნორმალები არ აქვს და OPENGL არ აკეთებს ნორმალების ავტომატურ დათვლას. ასეთი ობიექტებისთვის მოგიწევთ თვითონ გამოთვალოთ ნორმალები, წინააღმდეგ შემთხვევაში განათება ან საერთო ან არაკორექტულად იმუშავებს
ზედაპირის ნორმალი როგორც ვიცით მიუთითებს იმას თუ საით "იყურება" ეს ზედაპირი.
(IMG:
http://www.falloutsoftware.com/tutorials/gl/normal.jpg
)
ნორმალის გამოთვლა ადვილად ხდება როგორც 2 ვექტორის cross product-ი მესამე ვექტორი რომელის მიმართულია ამ ორის მართობულად. ამის შემდეგ უნდა მოხდეს ვექტორის ნორმალიზება:
(IMG:
http://www.falloutsoftware.com/tutorials/gl/polynormal.jpg
)
* * *
ნორმალის გამოთვლა:
CODE
// This is how a vertex is specified in the base code
typedef struct vertex_s
{
float x, y, z;
} vertex_t;
// normal(); - finds a normal vector and normalizes it
void normal (vertex_t v[3], vertex_t *normal)
{
vertex_t a, b;
// calculate the vectors A and B
// note that v[3] is defined with counterclockwise winding in mind
// a
a.x = v[0].x - v[1].x;
a.y = v[0].y - v[1].y;
a.z = v[0].z - v[1].z;
// b
b.x = v[1].x - v[2].x;
b.y = v[1].y - v[2].y;
b.z = v[1].z - v[2].z;
// calculate the cross product and place the resulting vector
// into the address specified by vertex_t *normal
normal->x = (a.y * b.z) - (a.z * b.y);
normal->y = (a.z * b.x) - (a.x * b.z);
normal->z = (a.x * b.y) - (a.y * b.x);
// normalize
normalize(normal);
}
void normalize (vector_t *v)
{
// calculate the length of the vector
float len = (float)(sqrt((v.x * v.x) + (v.y * v.y) + (v.z * v.z)));
// avoid division by 0
if (len == 0.0f)
len = 1.0f;
// reduce to unit size
v.x /= len;
v.y /= len;
v.z /= len;
}
ნორმალის ინფორმაციის მიწოდება OPENGL-ში ხდება glNormal3f ფუნქციის საშუალებით (ან შერეული მასივების...), რომელიც უნდა დაყენდეს წვეროს ინფორმაციის შეყვანამდე glVertex3f.
This post has been edited by
Abnormalia
on 5 Nov 2006, 13:53
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4097107
· 5 Nov 2006, 13:57 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
ამ ლექციის მაგალითები და სადემონსტრაციო პროგრამები ატვირთულია აქ:
http://dade.ge/?code=11627360016PSQ1TK5Y2
This post has been edited by
Abnormalia
on 5 Nov 2006, 13:57
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4118499
· 8 Nov 2006, 14:38 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
აი ეს კოდი შეიგიძლიათ ჩაამატოთ რენდერის ფუნქციაში და რენდერი მოხდება მხოლოდ წამში 30-ჯერ. ამით სხვადასხვა კომპებზე მიაღწევთ გადახატვის ერთი სიჩქარე რომ იყოს :)
CODE
static int cTime = 0;
if ( glutGet(GLUT_ELAPSED_TIME) - cTime < 1000/30 ) return;
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4141722
· 11 Nov 2006, 22:23 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
პროგრამა-მასწავლებლები ვისაც არ წაგიღიათ არის აქ:
http://www.4shared.com/dir/941879/2c9c7ef1/sharing.html
თეორია და მიმოხილვა მოგვიანებით
მიმაგრებული სურათი
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4149669
· 13 Nov 2006, 02:15 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
მოკლედ წინა ლექციაზე ლაითად შევეხეთ საკმაოდ რთულ თემას 3D გრაფიკაში - ტექსტურირებას. ჩვენ განვიხილეთ მაგალითები როგორ შეიძლება OpenGL-ში ყველაზე მარტივი ტექტურირების გაკეთება, როცა 2 განზომილებიან ტექსტურას ვადებთ ოთხკუთხედ ან სამკუთხედ ზედაპირზე.
მოკლედ OpenGL-ში უნდა გავიაროთ შემდეგი 4 ეტაპი ტექსტურირებისას:
1. შევქმნათ ტექსტურის ობიექტი და დავუნიშნოთ ტექსტურა.
2. გავნსაზვღროთ თუ როგორ უნდა იმოქმედოს ტექტურის პიქსელებმა (სხვანაერტად ტექსელებსაც-[texel - Texture Element] უწოდებენ) ობიექტის პიქსელებზე.
3. გავააქტიუროთ ტექსტურირების რეჟიმი.
4. დავხატოთ ტექსტურირებული ობიექტი, შესამაბიმი ტექსურის და გეომეტრიული ინფორმაციის გადაცემის საშუალებით.
განვიხილოთ თითოეული ეტაპი:
1 -- როგორც ვიცით ტექსტურა შეიძლება იყოს არამარტო 2 განზომილებიან არამე 1 და 3-იც. ტექსტურის ტექსელებზე ინფორმაცია შეიძლება იყოს მაქსიმუმ 4 ანუ RGBA.
2-- შესაძლებელია რამოდენიმე რეჟიმის წინასწარ დაყენება, რომლებიც განსაზღვრავენ თუ როგორ უნდა გამოითვალოს ტექსელის საბოლოო ფერი. ასე მაგალითად:
- გამოიყენოს უცვლელად ტექსელის ფერის, ამ რეჟიმს ქვია replace
-მეორე მეთორია მოდულაციის (modulate), ამ დროს ტექსტურის დადებისას ხდება მატერიალის და სინათლის გათვალისწინებაც.
3-- ტექსტურის გამოყენებამდე საჭიროა მისი გამოყენების დაშვება. OpenGL-ში თითქმის ასეთი ტიპის ოპერაციები ხდება glEnable/glDisable ფუქციების საშუალებით. პარამეტრები დამოკიდებულია ტექსტურის ტიპზე GL_TEXTURE1D, GL_TEXTURE2D ან GL_TEXTURE3D
4-- სცენის დახატვის დროს საჭიროა ტექსტურის კოორდინატების მითითება. ეს ხდევა glTexCoord ფუნქციის საშუალებით.
ტექსტურირების მაგალითი:
ეს ფუნქცია დისკიდან ტვირთავს ტექსტურას ვიდეო დაფის მეხსიერებაში და იმახსოვრებს ტექსტურის უნიკალურ ID-ს.
CODE
void loadTexture(void)
{
AUX_RGBImageRec *pTextureImage = auxDIBImageLoad( ".\\woodfloor.bmp" );
if( pTextureImage != NULL )
{
glGenTextures( 1, &g_textureID );
glBindTexture( GL_TEXTURE_2D, g_textureID );
glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexImage2D( GL_TEXTURE_2D, 0, 3, pTextureImage->sizeX, pTextureImage->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, pTextureImage->data );
}
if( pTextureImage )
{
if( pTextureImage->data )
free( pTextureImage->data );
free( pTextureImage );
}
}
2 განზომილებიანი ტექსტურირების დაშვება:
CODE
glEnable( GL_TEXTURE_2D );
მიმდინარე ტექსტურია არჩევა:
CODE
glBindTexture( GL_TEXTURE_2D, g_textureID );
ტექსტურირება:
CODE
glTexCoord2f(1.0,0.0); glVertex3f(1.0,2.0,1.0);
....
პროგრამის დასრულებისას სასურველია ტექსტურის "განადგურება" ;)
CODE
glDeleteTextures( 1, &g_textureID );
This post has been edited by
Abnormalia
on 13 Nov 2006, 02:35
მიმაგრებული სურათი
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4149847
· 13 Nov 2006, 03:22 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
ტექსტურის კოორდინატების ხელით მიწოდება არ მოგვიწევს, რადგან როდესაც რამე ტექსტურირებული მოდელი იტვირთება მას როგორც წესი მოყვება ეს ინფორმაცია.
OpenGL-ში ასევე შესაძლებელია ტექტურის კოორდინატების დაგენერირება.
ამისთვის საჭიროა, ჩავრთოთ ტექსტურის დაგენერირების რეჟიმი:
CODE
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
როდესაც ეს რეჟიმი ჩართულია ხდება ნებისმიერი glTexCoord ფუნქციის გამოძახების იგნორირება.
შემდეგ უნდა ავირჩიოთ ტექსტურის კოორდინატების დაგენერირების მეთოდი:
CODE
void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
void glTexGenfv(GLenum coord, GLenum pname, GLfloat *param);
პირველი პარამეტრი coord, მიუთითებს რომელის ტექსტურის კოორდინატაზე ვმოქმედებთ (GL_S, GL_T,...).
მეორე პარამეტრი (pname) შეიძლება იყოს ერთერთი ამ სამიდან:
GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, ან GL_EYE_PLANE (დაწვრილებით ქვემოთ)
და ბოლოს პარამეტრი (param) მიუთითებს გენერაციის რეჟიმს.
ეს არის ტექსტურირების გენერაციის საჩვენებელი პროგრამა. ისრებით ხდება ობიექტის მობრუნება, მარჯვენა კლავიშით გენერაციის რეჟიმების შეცვლა.
მიმაგრებული ფაილი ( Number of downloads: 74 )
texgen.zip
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4149858
· 13 Nov 2006, 03:28 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
განვიხილოთ ტექსტურის გენერაციის რეჟიმი
GL_OBJECT_LINEAR
:
ამ დროს ტექსტურის კოორდინატები გამოითვლება შემდეგი ფორმულით:
coord = P1*X + P2*Y + P3*Z + P4*W
სადაც X,Y,Z და W არიან ობიექტის წვეროს კოორდინატები და P1-P4 სიბრტყის განტოლების კოეფიციენტები. ამ შემთხვევაში მეფირება ხდება მოცემული სიბრტყიდან. მაგალითად თუ გვინდა S და T დავაპროეციროთ Z=0 სიბრტყიდან უნდა დავწეროთ შემდეგი:
CODE
// Projection plane
GLfloat zPlane[] = { 0.0f, 0.0f, 1.0f, 0.0f };
. . .
. . .
// Object Linear
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_S, GL_OBJECT_PLANE, zPlane);
glTexGenfv(GL_T, GL_OBJECT_PLANE, zPlane);
მიაქციეთ ყურადღება რომ ტექსტურის გენერაციის ფუნქციები შეიძლება სხვადასხვა იყოს S და T-თვის. ასევე ამ დროს როგორ არ უნდა მოვაბრუნოთ ობიექტი დაგენერირებული ტექსტურა არ შეიცვლება.
This post has been edited by
Abnormalia
on 13 Nov 2006, 03:31
მიმაგრებული სურათი
·
ციტირება
·
^
ამ ფორუმელის პოსტინგები გაქვთ იგნორირებული, ნახვისთვის დააწკაპუნეთ აქ
Abnormalia
Desert Creature
ჯგუფი: Registered
Abnormalia
Desert Creature
ჯგუფი: Registered
წერილები: 37247
წევრი No.: 1332
რეგისტრ.: 16-October 02
#4149861
· 13 Nov 2006, 03:34 · ·
პროფილი
·
პირადი მიმოწერა
·
ჩატი
შემდეგი რეჟიმი ესაა
GL_EYE_LINEAR
ეს რეჟიმი იყენებს იგივე ფორმულას რაც წინა, მხოლოდ 1 სხვაობით. წინა რეჟიმში მეფირების კოორდინატები განსაზღვრული იყო ობიექტის საკოორდინაციო სისტემაში. ამ შემთხვევაში კი კოორდინატების განსაზღვრულია ხედვის იგივე კამერის საკოორდინაციო სისტემაში.
CODE
// Projection plane
GLfloat zPlane[] = { 0.0f, 0.0f, 1.0f, 0.0f };
. . .
. . .
// Eye Linear
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv(GL_S, GL_EYE_PLANE, zPlane);
glTexGenfv(GL_T, GL_EYE_PLANE, zPlane);
შესაბამისად ობიექტის მობრუნება/გადაადგილება/მაშტაბირება იწვევს მეფირების შეცვლას:
This post has been edited by
Abnormalia
on 13 Nov 2006, 03:35
მიმაგრებული სურათი
(გადიდებისთვის დაუწკაპუნეთ სურათზე)
·
ციტირება
·
^
1 მომხმარებელი ათვალიერებს ამ თემას (1 სტუმარი და 0 უჩინარი წევრი)
0 წევრი:
მივიღოთ შეტყობინება ამ თემის განახლების შესახებ
·
გაუგზავნეთ ეს გვერდი სხვას
·
ამოსაბეჭდი ვერსია
|
თემის რჩეულებში დამატება/წაშლა
«
აქეთ
|
System/Graphic Programming
|
იქით
»
Pages:
(36)
« პირველი
...
4
5
[6]
7
8
...
ბოლო »
გამოხმაურება
·
ახალი თემა
·
ახალი გამოკითხვა
Close Topic Options
მივიღოთ შეტყობინება ამ თემის განახლების შესახებ
მივიღოთ შეტყობინება ელფოსტაზე ამ თემაში ახალი გამოხმაურებების შესახებ როცა თქვენ არ იქნებით აქტიური ფორუმში.
მივიღოთ შეტყობინება ამ განყოფილების განახლების შესახებ
მივიღოთ შეტყობინება ელფოსტაზე ამ განყოფილების განახლების შესახებ როცა თქვენ არ იქნებით აქტიური ფორუმში.
თემის ჩამოტვირთვა / ამოსაბეჭდი ვერსია
ჩამოტვირთეთ ეს თემა სხვადასხვა ფორმატში, ან ნახეთ მისი ამოსაბეჭდი ვერსია.
Forum Home
Search
დახმარება
საერთო ფორუმი
- General Discussion
- უსათაურო
- ფორუმის შესახებ
თემატური ფორუმი
- პოლიტიკა (+1 sub-forums)
- ქალი და მამაკაცი
- კულტურა და ხელოვნება (+4 sub-forums)
- მეცნიერება და განათლება (+7 sub-forums)
- მელომანია (+2 sub-forums)
- დასაქმება საქართველოში (+1 sub-forums)
- ბიზნესი და ეკონომიკა (+2 sub-forums)
- სამართალი
- სპორტი (+8 sub-forums)
- ჯანმრთელობა და მედიცინა (+2 sub-forums)
- სილამაზე და მოდა (+1 sub-forums)
- ფსიქოლოგია
- არსენალი (+1 sub-forums)
- ავტომობილები (+4 sub-forums)
- ფლორა და ფაუნა
- თბილისი (+1 sub-forums)
- მასმედია (+1 sub-forums)
- ინტელექტუალური სამაგიდო თამაშები
- კულინარია
- მშენებლობა და რემონტი (+1 sub-forums)
- მოგზაურთა კლუბი (+1 sub-forums)
ტექნიკური კონფერენცია
- AI ლაბორატორია
- კომუნიკაციები (+7 sub-forums)
- კომპიუტერები და ელექტრონიკა
- ყიდვა - გაყიდვა - გაცვლა (Redirect Forum)
- WWW (+4 sub-forums)
- Games (+6 sub-forums)
- Georgianisation
- პროგრამები
- პროგრამირება (+5 sub-forums)
- კომპიუტერული გრაფიკა და დიზაინი
- Apple
- Android Club (+8 sub-forums)
- პინგვინები და ეშმაკუნები
ყიდვა - გაყიდვა
- კომპიუტერული ტექნიკა (+2 sub-forums)
- ელექტრო და საყოფაცხოვრებო ტექნიკა
- მობილური ტელეფონები
- ავტომობილები
- უძრავი ქონება
- სხვადასხვა
[ Script Execution time: 0.0544 ] [ 12 queries used ] [ GZIP Disabled ]
Powered by Invision Power Board(U) v1.3 Final © 2003
IPS, Inc.