Tag: opengl

如何在openGL cubestack中的对象顶部打个洞?

我想在openGL cube.i尝试某些方法,如使用模板和alpha混合。但模板的问题是它是划分和显示只有一半的部分。我的要求是我必须堆叠立方体,应该让用户指定的孔数(矩形/椭圆形)仅限于顶部对象。我能够堆叠对象,但如果需要则无法创建孔。 我是openGL的新手,我找不到任何直接的解决方案。有人给出了这个要求的示例程序吗? 模具代码: glClear(GL_STENCIL_BUFFER_BIT); glColorMask(false, false, false, false); glEnable(GL_STENCIL_TEST); glStencilFunc(GL_EQUAL, 0, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glDisable(GL_DEPTH_TEST); glColor4f(0,0,1,1.0f); //code for cube glEnable(GL_DEPTH_TEST); glColorMask(true, true, true, true); glStencilFunc(GL_ALWAYS,0, 1); glStencilOp(GL_REPLACE,GL_KEEP, GL_ZERO); //code for cylinder glDisable(GL_STENCIL_TEST);

opengl:关于glutMainLoop()的问题

有人可以解释一下glutMainLoop如何工作的吗? 第二个问题,为什么glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 在glutDisplayFunc(RenderScene);之后定义glutDisplayFunc(RenderScene); 首先我们调用glClear(GL_COLOR_BUFFER_BIT); 然后才定义glClearColor(0.0f, 0.0f, 1.0f, 1.0f); int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(800, 00); glutInitWindowPosition(300,50); glutCreateWindow(“GLRect”); glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); glClearColor(0.0f, 0.0f, 1.0f, 1.0f); <– glutMainLoop(); return 0; } void RenderScene(void) { // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT); // Set current drawing color to […]

如何在OpenGL和GLUT中为键触发的旋转设置动画?

我想在C中使用GLUT在OpenGL中旋转一个简单的立方体。当我按下一个键时会发生旋转。 如果我使用glRotatef(angle, 0.0f, 1.0f, 0.0f) ,立方体将立即旋转而不需要动画。 我想慢慢旋转它,所以完成旋转大约需要2秒钟。

无法在OpenGL中将id分配给属性

我试图让OpenGL自动为glsl属性分配一个ID,但它失败了。 我的主要计划: #include #include #include #include “test.h” #include “shader_utils.h” static void error_callback(int error, const char* description) { std::cout << description << std::endl; } static void key_callback(GLFWwindow* window, int a, int b) { if (a == GLFW_KEY_ESCAPE && b == GLFW_PRESS) { glfwSetWindowShouldClose(window, GL_TRUE); } } void test() { std::cout << "Starting up" << std::endl; init(); […]

SDL_SaveBMP将图像上下颠倒

我已经使用SDL通过SDL_SaveBMP保存窗口图像。 问题是保存的图像是颠倒的。 保存的图像是 虽然必须如此 我该如何修复代码? screen_shotfunction: void screen_shot(std::string filename) { int width = glutGet(GLUT_WINDOW_WIDTH); int height = glutGet(GLUT_WINDOW_HEIGHT); SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0); glReadBuffer(GL_FRONT); glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, image->pixels); SDL_SaveBMP(image, filename.c_str()); SDL_FreeSurface(image); } 更新 我尝试翻转像素。 结果是纯黑色输出图像。 问题是什么? #include “SDL/SDL.h” #include “SDL/SDL_image.h” #include #include #include #include #include […]

如何在像糖果粉碎这样的游戏中为瓷砖分配颜色

我已经在C / C ++中进行了部分游戏,其中瓷砖在这里交换。 我想现在实施糖果粉碎,我知道画糖果需要花费很多精力。 让瓷砖完成工作。 在为瓷砖指定颜色的部分中,我不希望在行或列中显示三种颜色。 我如何以有效的方式做到这一点。 我目前正在随意分配颜色,如下所示: board[i][j].color=rand()%3; 看起来像这样: 是的我不希望行或列中的三个单元格或图块具有相同的颜色,即不超过两个相同颜色的相邻图块。 我的意思是我不想要一个颜色分配一次的解决方案,并检查一行中的三个瓷砖是否具有相同的颜色。 如果不再为所有图块生成颜色。 这太天真和昂贵。 另一种解决方案可以是在以光栅顺序检查向色块分配颜色之前,以查看下方或左侧的两个区块是否具有相同的颜色,如果是这样则分配一些其他颜色。 这也很明显。 有没有更好的办法? 在Weather Wane的回答之后,我发布了使用STL迭代器和set_difference方法进行设置差异操作的代码。 我正在尝试的是在通过使用设置操作仅消除已经重复两次(下方或左侧)的那些颜色来随机选择我正在形成的一组颜色之前。 代码中有问题。 我对STL知之甚少。 任何人都可以指导我如何正确使用它。 for(j=0;j<maxy;j++) {for(i=0;i<maxx;i++) { int first[] = {0,1,2,3},fsize,i34; std::vector v(5); std::vector::iterator it; board[i][j].x0=x0+i*dx+1; board[i][j].x1=x0+(i+1)*dx-1; board[i][j].y0=y0+j*dy+1; board[i][j].y1=y0+(j+1)*dy-1; if((i-1)>=0&&board[i-1][j].color==0&&(i-2)>=0&&board[i-2][j].color==0) {int second[] = {0}; std::sort (first,first+4); it=std::set_difference (first, first+4, second, second+1, v.begin()); v.resize(it-v.begin()); std::copy(v.begin(), v.end(), […]

如何在opengl中定位二十面体的面?

我从链接http://www.glprogramming.com/red/chapter02.html看到了以下代码来制作二十面体 #define X .525731112119133606 #define Z .850650808352039932 static GLfloat vdata[12][3] = { {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z}, {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X}, {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0} }; static GLuint tindices[20][3] = { {0,4,1}, […]

抛出OpenGLexception:读取访问冲突,窗口为0xCCCCCCCC

我使用的是我在上一个问题中描述的相同框架。 我通过创建一个新的DLL而不是仅仅将项目的构建类型从“Windows应用程序(.exe)”更改为“DLL(.dll)”来解决它。 但是现在当我在我的结构中使用GLFWwindow *类型的变量并尝试写入或读取时。 它总是导致分别弹出写访问或读访问冲突。 exception突然出现,就像窗口开始然后关闭一样,显示exception。 例外情况如下: – 抛出exception:读取访问冲突。 窗口是0xCCCCCCCC。 它发生在GLFW的window.c文件中,它指向尝试读取它的函数。 我甚至尝试使用指针来修改窗口,但它仍然没有用。 这是框架的代码: – 修改! 在window.h #ifndef LIB_GRAPHICS #define LIB_GRAPHICS #ifdef LIB_EXPORTS #define LIB_EXPORT _declspec(dllexport) #else #define LIB_EXPORT _declspec(dllimport) #endif #define LIB_FALSE 0 #define LIB_TRUE 1 #define LIB_BeginRender LIB_SetEvents(); LIB_ClearToColor #define LIB_EndRender LIB_SwapWindowBuffers #define LIB_CENTER_POSITION 0xCEAAFFEE /* Define other things… */ typedef const char* LIB_String; […]

#include :没有这样的文件或目录(即使源和头都在同一目录中)

我最近开始将我用Java编写的游戏引擎(使用lwjgl)转换为C / C ++。 我在Fedora 25上使用Qt Creator和CMake(我很确定这不影响任何事情)链接所有目录,文件等。我的系统上安装了GLFW,但我决定使用源版本,而不是比包含的版本。 我很高兴我的扩展加载器,并按照GLFW网站上的教程进行配置。 我没有通过“Hello World”测试,因为当我在我的main.c文件中包含glad.h文件时,我收到一个错误: : No such file or directory 同样奇怪的是我在glad.c文件中得到了同样的错误,该文件是使用glad自己的生成器创建的。 我的main.c文件看起来像这样 #include #include #include int main(int argc, char *argv[]) { printf(“Kick Ass Game Engine”); return 0; } 我也尝试过使用”glad.h:而不是 (我在这里找到了建议)。这对我的main.c文件有效,但是我对glad.c文件仍有同样的问题即使我编辑它以反映main.c 我的项目目录如下所示: – KAGE/ -> CMakeLists.txt -> glad.c -> glad.h -> main.c -> khplatform.h -> KAGE/lib/ -> glad -> glfw-3.2.1 […]

为什么我需要glut.h,glut32.lib,glut32.dll ALL来编译一个openGL程序?

据我所知,.lib文件是某种编译文件,当然dll文件包含其中的所有函数。 为什么我不能只使用.lib文件或.dll文件? 为什么说明书告诉我得到所有这三个? 顺便说一句,openGL文件是不是免费的,反正我们有一个“freeGLut”?