ورود

View Full Version : مبتدی: مشکل در پنجره OpenGL



agep110
چهارشنبه 29 خرداد 1392, 21:36 عصر
سلام.
من یه چند خط کد نوشتم اما نمیدونم چرا وقتی اجراش میکنم دکمه های Minimize ، maximize و Close دیده نمیشن. :خجالت::لبخند:ممنون میشم کمک کنید.:لبخند::چشمک:
http://s4.picofile.com/file/7810524622/l0.png

orache
پنج شنبه 30 خرداد 1392, 06:10 صبح
سلام اتفاقا دو سه روز پیش برای منم همین اتفاق افتاد وقتی کد اول صفحه رو نوشتم اینطوری شد بعد یک کد اماده رو دیدم کپی کردم درست شد فکر کنم مشکل ترتیب قرار گرفتن کد ها در داخل main هست و DisplayMode بیا این کد رو نگاه کن کد خودتم طبق این ترتیب بندی کن ببین درست میشه یا نه راستی از حالت glut_double استفاده کن
موفق باشی

#include <freeglut.h>


void display()
{
glClear(GL_COLOR_BUFFER_BIT);


glutSwapBuffers();
glFlush();
}


int main (int argc , char ** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(ZOOM_WIDTH,ZOOM_HEIGHT);
glutCreateWindow("name");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();

}

agep110
پنج شنبه 30 خرداد 1392, 08:53 صبح
بازم درست نشد. اینم ترتیب کد:
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GL_DOUBLE | GL_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Legend");

if (glewInit() != GLEW_OK)
{
fprintf(stderr, "Error On Load GLEW: %s\n", glewGetErrorString(glewInit()));
return 1;
}

createVertexBufferObject();
BuildProgram();
glutReshapeFunc(reshap);
glutDisplayFunc(renderScene);
glutMainLoop();
return 0;
}

orache
پنج شنبه 30 خرداد 1392, 13:43 عصر
متاسفم من دیگه نمیدونم چیه فقط یادمه من مشکلم حل شد دقیقا همین مشکل رو داشتم کار هایی که انجام شد که کدم درست در اومد
1_ ترتیب کد ها 2_ استفاده از مد GLUT_DOUBLE و 3 _ استفاده از glutSwapBuffers();
به نظر من مورد 3 باید درست باشه (شاید ) علت اصلیشو اگه کسی میدونه بگه ولی من مطمءن هستم که کد بالا درست کار میکنه شما همین کاری رو که من گفتم انجام بده از glFlush استفاده نکن از swapbuffer یا هردو استفاده کن ok
موفق باشی

amin1softco
پنج شنبه 30 خرداد 1392, 13:53 عصر
شما از freeglut استفاده کردید ممکنه این یک باگ باشه ولی بازم ترتیب ها را چک کنید و ببینید جایی خودتون بردر ها را حذف نکرده باشید
دستی هم می تونید تغییر بدید http://0xc0dec.org/2013/03/31/freeglut-fixed-window/ ولی در این لینک مشکل چیز دیگه ایی بوده

agep110
پنج شنبه 30 خرداد 1392, 13:56 عصر
این همه کد هایی که نوشتم:

#include <GL\glew.h>
#include <GL\freeglut.h>
#include <vector>
#include <iostream>
GLfloat vertexData[]={

0.25f, 0.25f, -1.25f, 1.0f,
0.25f, -0.25f, -1.25f, 1.0f,
-0.25f, 0.25f, -1.25f, 1.0f,

0.25f, -0.25f, -1.25f, 1.0f,
-0.25f, -0.25f, -1.25f, 1.0f,
-0.25f, 0.25f, -1.25f, 1.0f,

0.25f, 0.25f, -2.75f, 1.0f,
-0.25f, 0.25f, -2.75f, 1.0f,
0.25f, -0.25f, -2.75f, 1.0f,

0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, 0.25f, -2.75f, 1.0f,
-0.25f, -0.25f, -2.75f, 1.0f,

-0.25f, 0.25f, -1.25f, 1.0f,
-0.25f, -0.25f, -1.25f, 1.0f,
-0.25f, -0.25f, -2.75f, 1.0f,

-0.25f, 0.25f, -1.25f, 1.0f,
-0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, 0.25f, -2.75f, 1.0f,

0.25f, 0.25f, -1.25f, 1.0f,
0.25f, -0.25f, -2.75f, 1.0f,
0.25f, -0.25f, -1.25f, 1.0f,

0.25f, 0.25f, -1.25f, 1.0f,
0.25f, 0.25f, -2.75f, 1.0f,
0.25f, -0.25f, -2.75f, 1.0f,

0.25f, 0.25f, -2.75f, 1.0f,
0.25f, 0.25f, -1.25f, 1.0f,
-0.25f, 0.25f, -1.25f, 1.0f,

0.25f, 0.25f, -2.75f, 1.0f,
-0.25f, 0.25f, -1.25f, 1.0f,
-0.25f, 0.25f, -2.75f, 1.0f,

0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, -0.25f, -1.25f, 1.0f,
0.25f, -0.25f, -1.25f, 1.0f,

0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, -0.25f, -2.75f, 1.0f,
-0.25f, -0.25f, -1.25f, 1.0f,

0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,

0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,

0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,

0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,

0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,

0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,

0.5f, 0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 1.0f,

0.5f, 0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 1.0f,

1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,

1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,

0.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f,

0.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f,
};

GLuint vertexBufferObject;

const char *vertexShader =" \n\
#version 330 \n\
\n\
layout (location = 0) in vec4 position;\n\
layout (location = 1) in vec4 color;\n\
\n\
smooth out vec4 vertexColor;\n\
\n\
uniform vec2 offset;\n\
uniform mat4 perspectiveMatrix;\n\
void main()\n\
{\n\
vec4 camPos = position + vec4(offset.x, offset.y, 0.0, 0.0);\n\
gl_Position = perspectiveMatrix * camPos;\n\
vertexColor = color;\n\
}";

const char *fragmentShader ="\n\
#version 330\n\
\n\
out vec4 fragColor;\n\
smooth in vec4 vertexColor;\n\
\n\
void main()\n\
{\n\
fragColor = vertexColor;\n\
}";
GLuint offsetUnif;

void createVertexBufferObject()
{
glGenBuffers(1, &vertexBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STREAM_DRAW);

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);
}

GLuint createShader(GLenum shaderType, const std::string shaderFile)
{
GLuint shader = glCreateShader(shaderType);
const GLchar *shaderData = shaderFile.c_str();
glShaderSource(shader, 1, &shaderData, NULL);
glCompileShader(shader);

GLint shaderStatus;
glGetShaderiv(shader, GL_COMPILE_STATUS, &shaderStatus);
if (shaderStatus == GL_FALSE)
{
GLint shaderInfoLogLenght;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &shaderInfoLogLenght);

GLchar *shaderInfoLog = new GLchar[shaderInfoLogLenght + 1];
glGetShaderInfoLog(shader, sizeof(shaderInfoLogLenght), NULL, shaderInfoLog);

GLchar *shaderTypeLog = NULL;
switch (shaderType)
{
case GL_VERTEX_SHADER: shaderTypeLog = "Vertex"; break;
case GL_FRAGMENT_SHADER: shaderTypeLog = "Fragment"; break;
case GL_GEOMETRY_SHADER: shaderTypeLog = "Geometry"; break;
}
fprintf(stderr, "error on shader: %s\n", shaderTypeLog, shaderInfoLog);
delete[] shaderInfoLog;
}
return shader;
}

GLuint createProgram(const std::vector<GLint> shaderList)
{
GLuint program = glCreateProgram();
for (GLuint i = 0; i < shaderList.size(); i++)
{
glAttachShader(program, shaderList[i]);
}
glLinkProgram(program);

GLint programStatus;
glGetProgramiv(program, GL_LINK_STATUS, &programStatus);
if (programStatus == GL_FALSE)
{
GLint programInfoLogLenght;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &programInfoLogLenght);

GLchar *programInfoLog = new GLchar[programInfoLogLenght + 1];
glGetProgramInfoLog(program, programInfoLogLenght, NULL, programInfoLog);

fprintf(stderr, "Program link Failur:\n %s", programInfoLog);
delete[] programInfoLog;
}
for (GLuint i = 0; i < shaderList.size(); i++)
{
glDetachShader(program, shaderList[i]);
}
glUseProgram(program);
return program;
}
float thePerspectiveMatrix[16];
float fFrustumScale = 1.0f;
GLuint perspectiveMatrixUinf;
void BuildProgram()
{
std::vector<GLint> shaderList;
shaderList.push_back(createShader(GL_VERTEX_SHADER , vertexShader));
shaderList.push_back(createShader(GL_FRAGMENT_SHAD ER, fragmentShader));
createProgram(shaderList);
GLuint theProgram = createProgram(shaderList);

offsetUnif = glGetUniformLocation(theProgram, "offset");

perspectiveMatrixUinf = glGetUniformLocation(theProgram, "perspectiveMatrix");
float fzNear = 0.5f, fzFar = 2.76;
memset(thePerspectiveMatrix, 0, sizeof(float) * 16);

thePerspectiveMatrix[0] = fFrustumScale;
thePerspectiveMatrix[5] = fFrustumScale;
thePerspectiveMatrix[10] = (fzFar + fzNear) / (fzNear - fzFar);
thePerspectiveMatrix[14] = (2 * fzFar * fzNear) / (fzNear - fzFar);
thePerspectiveMatrix[11] = -1.0f;
glUniformMatrix4fv(perspectiveMatrixUinf, 1, GL_FALSE, thePerspectiveMatrix);

for (GLuint i = 0; i < shaderList.size(); i++)
{
glDeleteShader(shaderList[i]);
}
}

void renderScene()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glUniform2f(offsetUnif, 0.5f, 0.5f);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)(sizeof(vertexData) / 2));

glDrawArrays(GL_TRIANGLES, 0, 36);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

glutSwapBuffers();
glutPostRedisplay();
}
void reshap(int w, int h)
{
thePerspectiveMatrix[0] = fFrustumScale / (w / (float)h);
thePerspectiveMatrix[5] = fFrustumScale;
glUniformMatrix4fv(perspectiveMatrixUinf, 1, GL_FALSE, thePerspectiveMatrix);
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GL_DOUBLE | GL_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Legend");

if (glewInit() != GLEW_OK)
{
fprintf(stderr, "Error On Load GLEW: %s\n", glewGetErrorString(glewInit()));
return 1;
}

createVertexBufferObject();
BuildProgram();
glutReshapeFunc(reshap);
glutDisplayFunc(renderScene);
glutMainLoop();
return 0;
}

amin1softco
جمعه 31 خرداد 1392, 09:23 صبح
تابع main را با کد زیر جابه جا کنید مشکل حل می شه :

int main(int argc, char** argv)
{
glutInit(&argc, argv);

glutInitContextVersion(4, 0);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
glutInitContextProfile(GLUT_CORE_PROFILE);

glutSetOption(
GLUT_ACTION_ON_WINDOW_CLOSE,
GLUT_ACTION_GLUTMAINLOOP_RETURNS
);

glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Legend");
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB);




if (glewInit() != GLEW_OK)
{
fprintf(stderr, "Error On Load GLEW: %s\n", glewGetErrorString(glewInit()));
return 1;
}

createVertexBufferObject();
BuildProgram();
glutReshapeFunc(reshap);
glutDisplayFunc(renderScene);
glutMainLoop();
return 0;
}


در تابع رندر هم خط آخر زیادی است
glutPostRedisplay();

agep110
جمعه 31 خرداد 1392, 10:24 صبح
ممنون دوست عزیز. اما اینبار هیچی رو نشون نمیده :
http://s4.picofile.com/file/7812368595/4%D9%85.png

ولی وقتی کدایی که شما دادین رو پاک میکنم :
http://s4.picofile.com/file/7812369672/%D9%865.png

agep110
جمعه 31 خرداد 1392, 10:37 صبح
بلاخره درست شد. این خط مشکل داشت.
glutInitContextVersion(4, 0);
فکر کنم من از Vesrsion فدیمی GLUT استفاده میکنم برای همین این خط رو به جاش نوشتم :
glutInitContextVersion(2, 0);
یعنی من دارم از نسخه قدیمی GLUT استفاده می کنم؟ :افسرده:
به نظرتون از کارت گرافیک نیست(GeForce 9500GT)؟

amin1softco
جمعه 31 خرداد 1392, 10:57 صبح
GeForce 9500 GT
GeForce 9500 GT

On July 29, 2008 the GeForce 9500 GT was officially launched.

65 nm G96 GPU
32 Stream Processors.
550 MHz core, with a 1400 MHz unified shader clock.
8.8 billion texels/s fillrate.
256 MB/512 MB/1024 MB 1,600 MHz GDDR3 memory or 256 MB/512 MB 1,000 MHz GDDR2 memory, both with a 128-bit memory bus.
25.6 GB/s memory bandwidth for boards configured with GDDR3 800 MHz memory.
Support DirectX 10, Shader Model 4.0, OpenGL 3.3, and PCI-Express 2.0.
Supports 2nd generation PureVideo HD technology with partial VC1 decoding.[6][7]
NVIDIA SLI - ready technology
HDMI technology Support

شما باید اینجوریش کنید :
glutInitContextVersion(3,3);
این ورژن اپن جی ال است که مشخص می شه نه GLUT و شما از آخرین نسخه داری استفاده می کنید....

agep110
جمعه 31 خرداد 1392, 11:32 صبح
بله درسته اما وقتی این کد رو مینویسم بازم هیچی نشون نمیده. حالا به نظر شما اگه کلاً این خط رو پاک کنم بهتر نیست چون فکر کنم خودش به صورت پیشفرض از آخرین نسخه OpenGL استفاده میکنه درسته؟

amin1softco
جمعه 31 خرداد 1392, 11:37 صبح
اگر قصد استفاده از قابلیت های نسخه خاصی از جی ال را ندارید خیلی راحت حذفش کنید ;) بله درسته ولی الان ورژن 4 است دوروز دیگه 5 و 6 !!!