为什么在SDL和OpenGL中用IMG_Load加载到纹理的图像看起来偏蓝?
我正在加载PNG纹理: void Sprite::setTexture(string f) { SDL_Surface *image = IMG_Load(f.c_str()); if (image == NULL) { this->texture = -1; return; } SDL_DisplayFormatAlpha(image); unsigned object(0); glGenTextures(1, &object); glBindTexture(GL_TEXTURE_2D, object); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTe
4 2023-05-25
编程技术问答社区
带进度的快速文件复制
我正在编写用于Linux的SDL应用程序,该应用程序可从控制台(无X服务器)使用.我拥有的一个功能是文件复制机制,该功能将特定文件从HDD复制到USB闪存设备,并在UI中显示此副本的进度.为此,我在循环时使用简单,并通过8KB块复制文件来获得复制进度.问题是,它很慢.我可以在将近10分钟内复制100 MB文件,这是不可接受的. 如何实现更快的文件副本?我正在考虑一些异步的API,这些API会读取从HDD到缓冲区的文件并将数据存储到USB中,但我不知道我是否应该自己实施,因为这看起来并不容易.也许您知道一些C ++ API/库可以对我来说?还是其他更好的方法? 解决方案 不要随着复制进度同步更新您的UI,这会大大减慢事情的速度.您应该在主UI线程的单独线程上运行文件副本,以便文件副本可以尽可能快地进行,而不会阻碍应用程序的响应能力.然后,UI可以自然速率(例如,以您的显示器的刷新率)进行更新. 您还应该使用大于8 kb的缓冲尺寸.实验,但我认为您将获得更快的缓冲尺寸的结
0 2023-05-24
编程技术问答社区
为什么 SDL 在 Mac 上比 Linux 慢得多?
我正在研究一个单线阅读图形程序,该程序使用sdl2 渲染.有关较小的示例,请参见结尾. 它既可以在旧的Linux机器和旧的Mac上运行. Linux计算机具有1.60GHz处理器,而Mac的处理器为2.2GHz. Linux上的SDL版本为2.0.8,而Mac的SDL版本为2.0.10.在两台计算机上,我都使用优化标志-O3和-flto编译了clang++.我用./intergrid -fullscreen -pixel-size 3调用可执行文件(从本质上讲,我的程序绘制了很多像素.) 由于某种原因,较慢的Linux计算机没有汗水执行程序,而Mac花了几秒钟才能渲染第一帧.当我使用-no-draw标志禁用图形时,MAC比Linux机器快. 编辑:Linux计算机具有图形和Mac列表的" Intel Haswell Mobile"," Intel Iris Pro 1536 MB." 这是一个最小可重复的示例: #include #
2 2023-05-23
编程技术问答社区
OpenGL低级别的性能问题
与任何优化问题一样,这个主题受到了很多打击,但我只是找不到我想要的东西. 很多教程,即使如此,问题也有类似的提示;通常覆盖: 使用gl face culling(opengl函数,而不是场景逻辑) 仅向GPU发送1个矩阵(投影模块组合),因此将MVP计算从每个顶点降低到每个模型一次. 使用交织的顶点 尽可能多的GL调用,在适当的地方批量 ,可能还有一些/许多其他/其他.我(出于好奇的原因)使用几个顶点缓冲液在我的应用中渲染2800万个三角形.我已经尝试了上述所有技术(据我所知),并且几乎没有表现变化. 尽管我在实施中收到了大约40fps,但这绝不是有问题的,但我仍然对这些优化的"提示"实际使用? 感到好奇吗? 我的CPU在渲染过程中的闲置约为20-50%,因此i 假设我是GPU的限制,以提高性能. 注意:我目前正在研究gdebugger 交叉发布于游戏开发 解决方案 点1很明显,保存填充率也是如此.如果对象的原始词背面进行处理,则
4 2023-05-23
编程技术问答社区
SDL2有内存泄漏吗?
我注意到我所有使用SDL2的项目都有内存泄漏,所以我编写了一个看起来像这样的测试程序: SDL_Init(SDL_INIT_VIDEO); SDL_Window *win = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 100, SDL_WINDOW_RESIZABLE); SDL_Renderer *ren = SDL_CreateRenderer(win, 0, 0); bool running = true; SDL_Event event; while (running) { while(SDL_PollEvent(&event) != 0) { if(event.type == SDL_QUIT) { running = false; } } SDL_RenderClear(ren);
26 2023-05-23
编程技术问答社区
在OS X上加载曲面时,SDL2预先乘以alpha通道?
我正在加载32位rgba normalmap纹理,并在Alpha通道中编码一个高度图,通过SDL2 2.0.7和OS X Sierra上的SDL2 2.0.7和SDL2_IMAGE 2.0.2. 这些纹理中的每个像素都有非零的RGB值,编码了定向正常向量. (0,0,0)(即 black )的定向向量无效. 但是,当我通过sdl2_image加载这样的纹理时,纹理的区域的alpha值为0 也也 yart 产量rgb值为0.这些像素的值? 附件是这些普通伐形纹理之一.您可以通过打开例如gimp并在其中一个透明区域上使用彩色选择器.您会发现,确实,透明区域仍然具有蓝色的RGB颜色(编码的正常向量). 及以下是一个最小的测试案例,说明了附带的PNG文件的问题: #include #include int main(int argc, char **argv) { SDL_Surface *s = IMG
4 2023-05-22
编程技术问答社区
如何向SDL线程发送额外的参数?
是的,我知道如何创建SDL线程. int myfunc(void* data) { //my code... } SDL_CreateThread* mythread=SDL_CreateThread(myfunc,NULL); 但是,如果我想做类似的事情: int myfunc(void* data,int myparameter1,char myparameter2) { //my code... } SDL_CreateThread* mythread=SDL_CreateThread(myfunc,NULL,42,'c'); 即如何为具有多个参数的函数创建线程(参数不包括通常的" void* data") 如果不可能,您是否可以提出任何可以将参数传递到线程的方法? 解决方案 您可以在堆上创建struct,用数据设置其字段,然后将其地址传递到SDL_CreateThread: typedef struct { int par
2 2023-05-19
编程技术问答社区
使用SDL时没有stdout.txt
我正在使用Code :: Blocks 12.11在Windows 7下使用C ++进行小型游戏. 我正在使用MingW32-GCC编译器,并下载了SDL2(2.0.1)的标准预编译Windows发行版,并使用I686-W64-MINGW32版本. 到目前为止,我正在工作,我将获得图形输出,并且SDL_TTF扩展也可以工作. 从一开始就从未有过的唯一工作是从SDL中获取我的Stdout: : 不管我做什么,我在任何地方都不会在任何地方得到stdout.txt或stderr.txt,甚至没有看到一次创建的文件. 这些文件在运行时也不创建,并且在程序关闭时已删除,从来没有创建它们. 当我将程序作为控制台应用程序编译时,我会在该控制台中获得SDL错误输出,但没有COUT或PRINTF或FPRINTF(STDOUT ...)(尝试了所有三个). 编程没有SDL的东西时,控制台stdout输出正常. 因此,问题不是要重新路由stdout到主机,这是有关SDL和
0 2023-05-15
编程技术问答社区
SDL与g++在OSX Lion上的应用
剂量有人知道如何在OSX Lion上设置SDL(简单的直接媒体层),以便我可以用G ++编译代码? 我已经阅读了包裹附带的"读书",并且将Frameworks文件夹放在相关目录中,但是,这似乎还不够. 谁能帮我 ? (我不想使用Xcode) 解决方案 如果您不使用Xcode,并且正在使用gcc编译SDL项目,则可以运行: gcc -o test SDLTest.c `sdl-config --cflags --libs` g++ -o test SDLText.c `sdl-config --cflags --libs` 这对我的Mac- sdl-config --version返回1.2.14愉快地工作,我可以运行test :)
2 2023-05-14
编程技术问答社区
在运行OS X 10.7 Lion的Mac上从源代码编译SDL
我已经从libsdl网站下载了SDL源SDL-1.2.14.zip,然后迈出了步骤. 当我./configure时,我没有问题.但是,当i make>>>>>>>> make时,在整个编译过程中似乎很长的路要走,并随着此输出而死亡: /bin/sh ./libtool --mode=compile gcc -g -O2 -I./include -D_GNU_SOURCE=1 -DTARGET_API_MAC_CARBON -DTARGET_API_MAC_OSX -fvisibility=hidden -I/usr/X11R6/include -DXTHREADS -D_THREAD_SAFE -force_cpusubtype_ALL -fpascal-strings -c ./src/video/SDL_RLEaccel.c -o build/SDL_RLEaccel.lo libtool: compile: gcc -g -O2 -I./include -D_GNU_
2 2023-05-14
编程技术问答社区
在Mac OS X Lion上用Xcode 4设置SDL
我一直在尝试获得一个超级简单的SDL程序来工作.我正在使用Mac OS X Lion.我有SDL可以在Snow Leopard工作,但似乎不想在狮子工作.到目前为止,我都有: #include #include "SDL/SDL.h" using namespace std; /* #ifdef main # undef main #endif */ int main( int argc, char* args[] ) { SDL_Surface* hello = NULL; SDL_Surface* screen = NULL; SDL_Init( SDL_INIT_EVERYTHING ); screen = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE ); hello = SDL_LoadBMP( "hello.bmp" ); SDL_BlitSurf
2 2023-05-14
编程技术问答社区
OS X El Capitan上的SDL_image视觉故障
尝试使用c或python中的pygame加载和显示位图(都使用sdl)时,它会引起小故障(请参阅下面的屏幕截图). 我尝试搜索它,发现它可能与SDL_IMAGE与OS X El Capitan不兼容有关,但没有解决方案.有人吗? 目前,我尝试了: 安装SDL_IMAGE 1.2.10(最新兼容版本). nope! 通过自定义公式安装SDL_IMAGE 1.2.10. 也没有! 在屏幕截图上,这些随机像素应为三个红色砖头图.顺便说一句,我正在使用这些功能加载和绘制位图: tileset[0] = al_load_bitmap("./data/gfx/bricks.png"); al_draw_bitmap(tileset[0], pos_x, pos_y, 0); 解决方案 该错误实际上是在El Capitan下使用的SDL_IMAGE.通过将sdl_image降低到1.2.10( sdl),可以解决解决方法.您可能已经安装了SDL 1.2.10,但仍
2 2023-05-14
编程技术问答社区
在Mac OSX El Capitan上使用OpenGL的渲染故障
我使用SDL 1.2 + OpenGL 1.1创建了一个用于OSX的网球游戏. 一切都还好,直到El Capitan.现在,一些纹理无法正确显示. 法院白线现在是黑色的.玩家纹理都不好.左侧的能量棒都是黑色的: 图标上的白线不正常.突出显示的图标上的彩虹纹理也不是: 游戏通常应该看起来如何: 所以错误的纹理是: 玩家:使用RGBA 使用不同的纹理重新创建游戏中的创建 白线(现在是黑色):普通RGBA纹理 能量栏(左侧):普通RGBA纹理 其他一些GUI元素,但不是全部:主要是正常的RGBA纹理 此外,只有游戏的AppStore版本才能得到这些故障. 我从网站上分发的版本似乎是免费的(=> 我完全对正在发生的事情感到困惑.我知道El Capitan只是在OS呈现内容的方式上带来了很大的变化,但我不知道在哪里看,甚至更少要解决的问题. 看来它仅触及RGBA纹理,但并非全部,因为大多数GUI元素仍然正确显示. 因此,请提前感谢您提供的任何提示!
0 2023-05-14
编程技术问答社区
Windows远程OpenGL的现状和解决方案
OpenGL和Windows遥控器不能很好地播放. 解决方案取决于用例,答案在网络的广泛深度分散. 这是我开始研究这个文章的文章,无论是针对编码器还是非编码器. 问题: Windows的RDP会话不会揭露图形卡,至少不会直接直接曝光.例如,您无法更改桌面分辨率,而GraphicsCard驱动程序通常只是禁用其设置菜单.因此,启动高于v1.1的OpenGL上下文失败了.尤其是在支持IRC中,通常建议"不要使用WindowsRemote",这对许多人来说不是一个选择.在许多公司环境中,Windows Remote是一种经常使用的工具,并且还必须在此处工作. 非代码解决方法 您可以启动OpenGL程序,允许其查看图形卡,创建OpenGL上下文,然后通过WindowsRemote连接.这始终可以起作用,因为Windows遥控器只是传输窗口内容.这可以通过: 来完成 一个批处理脚本,可以关闭会话并启动程序,从而使您可以连接到已经运行的程序. (使用VNC或其他用于
0 2023-05-10
编程技术问答社区
使用SDL_TTF的OpenGL中的文本
我是OpenGL的初学者,我创建了一个功能,可以使用SDL_TTF在OpenGL中编写文本.这是我功能的代码: #define WINDOW_WIDTH 832 #define WINDOW_HEIGHT 487 #define glVertex2px(x,y) glVertex2d((double)(x) * 2.0 / (double)WINDOW_WIDTH - 1.0, 1.0 - (double)(y) * 2.0 / (double)WINDOW_HEIGHT); void glWriteText2d(TTF_Font *font,const char *text,SDL_Color color,const int x,const int y){ GLuint texture; SDL_Surface *surface; surface = TTF_RenderText_Blended(font,text,color); glGenTex
2 2023-05-10
编程技术问答社区
glDrawArrays在GL_TRIANGLES模式下没有绘制任何东西
我的问题是glDrawArray命令停止工作.我编写了一些我使用该命令的程序.但是现在,我不知道为什么它不起作用. ,但我仍然可以用GL_LINES而不是GL_TRIANGLES. 在屏幕上画线 这是我的代码: #include "Mesh.h" #include Mesh::Mesh() { glGenVertexArrays(1, &vao); glBindVertexArray(vao); glGenBuffers(1, &vbo); size = 0; } void Mesh::AddVertices(const Vertex vertices[], int length) { size = length; glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), ver
2 2023-05-10
编程技术问答社区
SDL在C++中的OpenGL,纹理着色器缺少纹理
我正在尝试创建我的第一个OpenGL着色器,但是在试图在Cube对象上添加纹理时遇到困难. 有人尖锐的眼睛足以发现错误吗?该代码可能会有很多错误,如果有人指出它们,我将很感激,但是我对为什么旋转的立方体是灰色而不是色彩鲜艳. 最感兴趣. (我跳过了所有错误处理以保持源代码尺寸低,对此很抱歉) **编辑发现我错过了一些紫外线设置,虽然仍然是灰色立方体... #include #include #include #include #include #include #include using namespace std; void initAll(); void setupBox(); void mainloop(); unsigned int
0 2023-05-10
编程技术问答社区
在固定的管道中用OpenGL绘制纹理时屏蔽部分纹理
我试图找出绘制纹理部分掩盖的最佳方法.我的问题是因为我似乎已经掌握了alpha面具! 我们正在使用OpenGL绘制自定义的2D游戏引擎.该游戏是由精灵和简单的块纹理构建的. 我的期望结果是这样: 绘制了一个角色精灵(使用它的alpha颜色,不仅是盒子) 将项目吸引到玩家手中(还使用其alpha颜色将其绘制到场景中而不是盒子的情况下) 该物品应出现在角色手臂/手的后面,但在身体的其余部分之上. 目前,我唯一能弄清楚如何实现这一目标的方法就是按顺序绘制它们(身体,物品,手臂),但我想避免这种情况以使艺术品资产更容易处理.我的想法解决方案是绘制角色,然后用alpha面膜绘制物品,该面膜阻止应"在"手臂下面的纹理区域. 我看到的其他解决方案就像 this ,其中glblendfuncseparate()使用功能.我试图避免引入扩展,因为我当前版本的OpenGL不支持它.并不是说我反对这个想法,但是在绘制alpha面具的情况下,它似乎有点烦恼? 我完全承认这
2 2023-05-10
编程技术问答社区
为什么CG着色器不能在GL 3.2下工作?
我已经尽一切努力使OpenGL 3.2在游戏引擎中使用CG着色器渲染,但我没有运气.因此,我决定进行一个裸露的项目,但着色器仍然无法正常工作.从理论上讲,我的测试项目应该仅渲染一个红色的三角形,但它是白色的,因为着色器没有做任何事情. 我将在此处发布代码: #include #include #include #include #include #include #include #include int main() { SDL_Window *mainwindow; SDL_GLContext maincontext; SDL_Init(SDL_INIT_VIDEO); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION
0 2023-05-10
编程技术问答社区
OpenGL白色空白屏幕,没有反应
我正在使用带有OpenGL的SDL2.00来创建程序.该程序目前不应该做任何事情,这只是一个测试床.但是我遇到了一个问题.当我使用sdl_createwindow创建一个窗口时,该窗口进入繁忙的状态并停止响应.程序流并不真正受到此影响,但是窗口本身无法正常工作.它所做的就是显示一个白色的空白窗口,不接受输入,无法调整大小不能移动,也不能退出.我会附加代码,但我怀疑它与代码有关,因为我已经使用SDL制作了一些程序,并且它们似乎可以正常工作. 使用VS2013 SDL2.00 OpenGL ==================== #include "stdafx.h" void init() { glClearColor(0.0, 0.0, 0.0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, 640.0 / 480.0, 1.0, 500.0); glMatr
0 2023-05-10
编程技术问答社区