PDA

View Full Version : سوال: مشکل با نمایش VBO



UfnCod3r
پنج شنبه 28 دی 1391, 20:15 عصر
سلام
من وقتی می خوام مدل رو نمایش بدم مشکل پیش میاد !
یعنی وقتی اندیکس های تو VBO می دم مشکل داره اما مستقیم میدم نه ! دعوا سر خط 80 هست !:متفکر:
خط 77 که کامنتوندمش کار میکنه !:متفکر: :بامزه:
:عصبانی++:
:متفکر:



#include <GL/glew.h>

#include <Windows.h>
#include <stdlib.h>
#include <sdl.h>

struct Vec2{float x,y; };
struct Vec3{float x,y,z; };

GLuint g_texID;
GLuint g_vboID;

Vec3 g_vertices[3] = {{0,0,0}, {200,0,0}, {0,200,0}};
Vec3 g_normals[3] = {{0,0,0}, {1,0,0}, {0,1,0}};
Vec3 g_colors[3] = {{1,0,0}, {0,1,0}, {0,0,1}};
Vec2 g_tCoords[3] = {{0,0}, {1,0}, {0,1}};
GLushort g_indexes[3] = {0,1,2};

void InitGL()
{
//Texture Load ----------
SDL_Surface* $bmp = SDL_LoadBMP("asd.bmp");
glGenTextures(1, &g_texID);
glBindTexture(GL_TEXTURE_2D, g_texID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, $bmp->w, $bmp->h, 0, GL_RGB, GL_UNSIGNED_BYTE, $bmp->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
SDL_FreeSurface($bmp);

glGenBuffersARB(1,&g_vboID);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, g_vboID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(g_vertices)+sizeof(g_normals)+sizeof(g_colo rs)+sizeof(g_tCoords)+sizeof(g_indexes)
, 0, GL_STATIC_DRAW_ARB);
glBufferSubData(GL_ARRAY_BUFFER_ARB, 0, sizeof(g_vertices), g_vertices);//verts
glBufferSubData(GL_ARRAY_BUFFER_ARB, sizeof(g_vertices), sizeof(g_normals), g_normals);//norms
glBufferSubData(GL_ARRAY_BUFFER_ARB, sizeof(g_vertices)+sizeof(g_normals), sizeof(g_colors), g_colors);//cols
glBufferSubData(GL_ARRAY_BUFFER_ARB, sizeof(g_vertices)+sizeof(g_normals)+sizeof(g_colo rs)
, sizeof(g_tCoords), g_tCoords);//tcoord
glBufferSubData(GL_ARRAY_BUFFER_ARB, sizeof(g_vertices)+sizeof(g_normals)+sizeof(g_colo rs)+sizeof(g_tCoords)
, sizeof(g_indexes), g_indexes);//indexes

glMatrixMode(GL_PROJECTION);
glOrtho(0,800,600,0,0,1000);
glMatrixMode(GL_MODELVIEW);

glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}

float r = 0;
void Draw()
{
glLoadIdentity();
r += 0.6f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glTranslatef(400,300,0);
glRotatef(r, 0.0f, 0.0f, 1.0f);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, g_vboID);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_INDEX_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, (void*)0);
glNormalPointer(GL_FLOAT, 0, (void*)sizeof(g_vertices));
glColorPointer(3, GL_FLOAT, 0, (void*)(sizeof(g_vertices)+sizeof(g_normals)));
glTexCoordPointer(2,GL_FLOAT, 0, (void*)(sizeof(g_vertices)+sizeof(g_normals)+sizeo f(g_colors)));

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, g_indexes);

//?????????????????
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT
, (void*)(sizeof(g_vertices)+sizeof(g_normals)+sizeo f(g_colors)+sizeof(g_tCoords)));
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_INDEX_ARRAY);

SDL_GL_SwapBuffers();
}

int main(int argc, char** argv)
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* $scrSurf = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL | SDL_DOUBLEBUF);

glewInit();
if(glewIsSupported("GL_ARB_vertex_buffer_object"))
printf("GL_ARB_vertex_buffer_object Supported");
else
{
printf("GL_ARB_vertex_buffer_object Not Supported");
return 0;
}

InitGL();

bool $run = true;
while($run)
{
SDL_Event $event;
while(SDL_PollEvent(&$event))
{
switch ($event.type)
{
case SDL_QUIT:
$run = false;
break;
}
}
Draw();
Sleep(16);
}

glDeleteBuffersARB(1, &g_vboID);
glDeleteTextures(1, &g_texID);
return 0;
}

amin.v
پنج شنبه 28 دی 1391, 20:54 عصر
پارامتر آخر glDrawElements آدرس index هارو میخواد که اگه از بافر سخت افزاری استفاده کنید باید 0 بگذارید و قبل از glDrawElements بافر index هارو bind کنید ...

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER , EBO);
و اگر هم از بافر سخت افزاری استفاده نمیکنید ( مثل مورد شما ) باید آدرس اولین مقدار تو آرایه تون رو بهش بدید یعنی :

g_indexes[0]

UfnCod3r
پنج شنبه 28 دی 1391, 21:48 عصر
ممنون !
من همه رو برده بودم تو یه بافر نمیدونم بهتره یا نه تو یه اموزش این طوری بود !:متفکر:
الان ایندکس ها رو یه بافر جدا گرفتم درست شد !:تشویق:

GLuint g_indexID;
glGenBuffersARB(1, &g_indexID);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, g_indexID);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(g_indexes), g_indexes, GL_STATIC_DRAW_ARB);

//on draw
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, g_indexID);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);


حالا یه سوال BUFFER_ARB با BUFFER چه فرقی داره ؟:متفکر:

یه سوال دیگم :لبخند:
زیاد به اینجا ربط نداره ولی خب حوصله ندارم تاپیک بزنم !:خجالت:
کسی میتونه یه پلاگین برا بلندر بنویسه که مش اکسپورت کنم !
می خوام باینری باشه نه مثل .obj
:ناراحت:

amin.v
پنج شنبه 28 دی 1391, 22:31 عصر
Attribute های یه ورتکس رو میشه تو یه بافر نگه داشت و اتفاقا کار خیلی خوبی هست ولی index هارو نمیشه چون اصلا نوع بافر با هم فرق داره ...

توابع و Enum هایی که انتهاشون ARB یا EXT یا ATI یا NV یا ... هست اینها extension هستند ... بعضی از این extension ها ( اونهایی که با ARB تموم میشن معمولا ) بعدا به خوده توابع OpenGL اضافه میشن و دیگه نیاز نیست اون ARB رو انتها بنویسید ( یک کاری رو انجام میدن )

در مورد اکسپورت مش ، اگه بخوای برا بلندر اکسپورتر بنویسی باید python کار کنی و api کدنویسی بلندر رو هم یاد بگیری ... ولی من خودم یه کد کوچولو نوشتم که فرمت ply رو به یه فرمت باینری ساده تبدیل میکنه و بعد از اون استفاده میکنم ...

pswin.pooya
پنج شنبه 28 دی 1391, 22:42 عصر
سلام
بافر انديش رو از بافر ديتاي ورتكس جدا كني بهتره.

يه قضيه اي هست كه بهش مي گن multi streaming ( داخل كتاب GPU Gems2 بهش اشاره شده) كه اگر اون رو پياده سازي كني بهتره.

يه روشي كه خود من استفاده كردم و خوب جواب داد جدا كردن كامل ديتاهاي مربوط به مكان ورتكس و موارد ديگه مثل مختصاتهاي تكسچر بود. اين عمل باعث ميشه كه فقط اون قسمتي از داده رو كه لازم داري براي رندر ارسال كني. مثلا توي رندر سايه نيازي به tex coord نداري و فقط مختصات رو بدي كافي هست. البته منظورم از اين جدا كردن فقط داخل يه بافر بود. يعني اول كامل ورتكسها رو مي ذاشتم، پشت سرش مختصاتهاي تكسچر و ....




یه سوال دیگم :لبخند:
زیاد به اینجا ربط نداره ولی خب حوصله ندارم تاپیک بزنم !:خجالت:
کسی میتونه یه پلاگین برا بلندر بنویسه که مش اکسپورت کنم !
می خوام باینری باشه نه مثل .obj
:ناراحت:كسي رو پيدا كردي به ما هم اطلاع بده. :لبخند:. قالبهاي آماده هم خوب هستن. سعي كن از اونها استفاده كني مگر اينكه يه مورد خاص باشه كه ساپورت نكنند.


حالا یه سوال BUFFER_ARB با BUFFER چه فرقی داره ؟:متفکر:الحاقي هاي OpenGL معمولا اول توسط يه سازنده خاص (vendor) مطرح ميشه كه انتهاي اون برچسب سازنده (مثلا _NV)‌رو مي گيره. حالا اگر الحاقي توسط برد ARB ( يه گروه بزرگ از سازنده ها) تاييد بشه عنوان ARB رو ميگيره كه اين مطلب رو مي رسونه اكثر سازنده ها شكل يكساني از اون رو پياده سازي مي كنن. و در نهايت اگر الحاقي ضروري و يا مفيد باشه وارد هسته (core) ميشه و تمامي اين برچسب ها كنده كنار گذاشته ميشه.

مثلا اگر از OpenGL 2.x يا بالاتر استفاده مي كني به جاي دستور glGenBuffersARB بايد از glGenBuffers استفاده كني.


يه برنامه اي به اسم gdebugger هست كه امكان ميده بتوني برنامه هاي OpenGL رو ديباگ كني. يكي از امكانات اين برنامه گزارش استفاده از دستورهاي نامناسب است. مثلا وقتي داري از اين دستور استفاده ميكني ميگه كه اين بهتره از معادل لون يعني glGenBuffers استفاده كني.