我正在Windows中构建物理模拟引擎和编辑器.我想使用Qt构建编辑器部分,我想使用SDL和OpenGL来运行引擎.
我的第一个想法是仅使用Qt构建编辑器,并与引擎(资源管理器,渲染器,数学)共享尽可能多的代码.但是,我还希望能够在编辑器中运行模拟.这意味着我还必须共享使用SDL线程的模拟代码.
所以,我的问题是:有没有办法通过使用SDL将OpenGL渲染到Qt窗口?
我在网上看到,可以为SDL提供一个窗口句柄来呈现.有人有经验吗?
此外,模拟器的线程部分可能会出现问题,因为它使用SDL线程.
我正在学习一个3D opengl的地方,而且相当不错,我现在有一个漂亮的相机和一些简单的立方体物体.目前正在使用顶点数组,但我在这里很快就交换到了VBO.我只是想尝试剔除,但是我不确定我应该指定我的顶点的顺序,现在这就是我正在做的事情:
void cube::update_verts(){
GLushort cur=0;
///back face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
///right face
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
///top face
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
///front face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;
///bottom face
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
///left face
verts[cur++]=x; verts[cur++]=y+sy; …Run Code Online (Sandbox Code Playgroud) 我有点坚持SDL2纹理背后的逻辑.对我来说,它们毫无意义,因为你无法吸引他们.
在我的计划,我有几个面(或什么是表面之前,我切换到SDL2),我只是图混合在一起,形成层.现在,似乎我需要创建几个渲染器和纹理来创建相同的效果,因为SDL_RenderCopy它采用纹理指针.
不仅如此,所有渲染器都必须来自一个窗口,我明白这一点,但仍然会让我更加严重.
这一切看起来都非常庞大和缓慢.我错过了什么吗?有没有办法直接绘制纹理?纹理有什么意义,我可以安全地使用多个(如果不是数百个)渲染器来代替表面吗?
我正在编写一个3D模型查看器应用程序作为业余爱好项目,也作为一个测试平台来尝试不同的渲染技术.我正在使用SDL来处理窗口管理和事件,以及用于3D渲染的OpenGL.我的程序的第一次迭代是单线程的,运行得很好.但是,我注意到单线程程序导致系统变得非常缓慢/滞后.我的解决方案是将所有呈现代码移动到不同的线程中,从而释放主线程来处理事件并防止应用程序无响应.
该解决方案间歇性地工作,程序经常因为主要来自X窗口系统的变化(并且在我看来奇怪)一组错误而崩溃.这让我质疑我最初的假设,即只要我的所有OpenGL调用都发生在创建上下文的线程中,一切都应该仍然有效.在花了一天的大部分时间在互联网上寻找答案后,我彻底难过了.
更简洁:是否可以在主线程以外的线程中使用OpenGL执行3D渲染?我是否仍可以使用此配置的跨平台窗口库(如SDL或GLFW)?有没有更好的方法来做我想做的事情?
到目前为止,我一直在使用C++在Linux(Ubuntu 11.04)上进行开发,尽管如果有一种在这些语言中效果更好的解决方案,我也对Java和Python感到满意.
更新:根据要求,一些澄清:
我的应用程序的多线程版本出现的错误:
XIO:X服务器上的致命IO错误11(资源暂时不可用)在73个请求(73个已知处理)之后":0.0",剩余0个事件.
X请求失败的错误:BadColor(无效的Colormap参数)失败请求的主要操作码:79(X_FreeColormap)失败请求中的资源ID:0x4600001失败请求的序列号:72输出流中的当前序列号:73
游戏:../../ src/xcb_io.c:140:dequeue_pending_request:断言`req == dpy-> xcb-> pending_requests'失败.中止
我总是得到上面三个错误中的一个,我得到的一个变化,显然是随机的,这(我的眼睛)似乎证实我的问题确实源于我使用线程.请记住,我正在学习,因此我很有可能在我的无知中,我有一些相当愚蠢的东西.
解决方案:对于遇到类似问题的任何人,我通过将调用移至SDL_Init(SDL_INIT_VIDEO)渲染线程并使用互斥锁锁定上下文初始化来解决我的问题.这可以确保在将要使用它的线程中创建上下文,并且它可以防止主循环在初始化任务完成之前启动.启动过程的简化概述:
1)主线程初始化struct将在两个线程之间共享,并包含互斥锁.
2)主线程生成渲染线程并暂停一段时间(1-5ms),使渲染线程有时间锁定互斥锁.暂停后,主线程在尝试锁定互斥锁时阻塞.
3)渲染线程锁互斥,初始化SDL的视频子系统并创建OpenGL上下文.
4)渲染线程解锁互斥锁并进入其"渲染循环".
5)主线程不再被阻塞,因此在完成初始化步骤之前锁定和解锁互斥锁.
请务必阅读答案和评论,那里有很多有用的信息.
Visual Studio 2015集成了Android Emulator支持.他们甚至有一个预先制作的模板来设置Windows Phone,Android和iOS目标.看起来应该有一些方法可以在同一个解决方案中设置SDL 2.0,以便在Android和Windows之间轻松切换.我真的希望有一个包含SDL 2.0的现有模板,或者关于这个主题的教程.
我现在在哪里?我有一个工作代码库,我一直在基于SDL 2.0的visual studio 2015中维护,很久以前我手动将它移植到我的Mac上的Xcode,我能够在模拟器中运行.我还没有在Android上运行.xcode中的端口可能已经过时了,因为我已经更新了多个库并且它是在三年前.
我对这个问题的理想答案将导致Visual Studio 2015项目的SDL 2.0配置适用于iOS,Android和Windows.我正在寻找的是一系列创建模板项目的步骤,可以用作在Windows或Android模拟器上通过SDL初始化OpenGL上下文的起点.
这可能要求很多,但我希望有人已经完成了这项工作,并且可以在这里与世界分享.
对于我在R&Rcpp + OpenMP&Shiny中制作的实时交互式Mandelbrot查看器我正在寻找一种高性能的方式来显示1920x1080矩阵作为光栅图像,以期能够实现ca. 5-10 fps(计算Mandelbrot图像本身现在在中等变焦时达到约20-30 fps,当然滚动应该快速).使用image()with选项useRaster=TRUE,plot.raster或者甚至grid.raster()还没有完全削减它,所以我正在寻找更高性能的选项,理想情况下使用OpenGL加速.
我注意到有qt 包装器qtutils和qtpaint
http://finzi.psych.upenn.edu/R/library/qtutils/html/sceneDevice.html
你可以在其中设置参数opengl=TRUE和
http://finzi.psych.upenn.edu/ R/library/qtpaint/html/qplotView.html
再次使用参数opengl=TRUE和http://finzi.psych.upenn.edu/R/library/qtpaint/html/painting.html.
我还注意到应该能够使用rdyncall软件包调用SDL和GL/OpenGL函数(从https://cran.r-project.org/src/contrib/Archive/rdyncall/安装,从https://安装SDL)www.libsdl.org/download-1.2.php)`,演示可在http://hg.dyncall.org/pub/dyncall/bindings/file/87fd9f34eaa0/R/rdyncall/demo/00Index获得,例如http:// hg.dyncall.org/pub/dyncall/bindings/file/87fd9f34eaa0/R/rdyncall/demo/randomfield.R).
我是否正确使用这些软件包,应该能够使用opengl加速显示2D图像栅格?如果是这样,有没有人想过如何做到这一点(我问,因为我不是qt或SDL/OpenGL的专家)?
非OpenGL选项的某些时间对我的应用来说太慢了:
# some example data & desired colour mapping of [0-1] ranged data matrix
library(RColorBrewer)
ncol=1080
cols=colorRampPalette(RColorBrewer::brewer.pal(11, "RdYlBu"))(ncol)
colfun=colorRamp(RColorBrewer::brewer.pal(11, "RdYlBu"))
col = rgb(colfun(seq(0,1, length.out …Run Code Online (Sandbox Code Playgroud) 我在寻找编译使用C++程序最简单的方法SDL2和SDL_image与cmake的.
经过几个小时的搜索后,这是我最好的尝试:
的CMakeLists.txt
project(shooter-cmake2)
cmake_minimum_required(VERSION 2.8)
set(SOURCES
shooter.cpp
classes.cpp
utils.cpp
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
add_executable(${PROJECT_NAME} ${SOURCES})
INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2_image REQUIRED sdl2_image)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
In function `loadTexture(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, SDL_Renderer*)':
undefined reference to `IMG_LoadTexture'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
这是函数调用:
#include "SDL.h"
#include "SDL_image.h"
SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){
SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());
texture != nullptr or die("LoadTexture");
return texture;
}
Run Code Online (Sandbox Code Playgroud)
我很绝望.请帮我!谢谢!:)
有一段时间我一直在考虑尝试将我最喜欢的经典PC游戏之一,The Ur-Quan Masters(又名Star Control 2)移植到iPhone上.UQM将SDL用于其所有图形,声音,输入和其他游戏内容,似乎有一个SDL到iPhone的端口,但它在这一点上看起来并不十分成熟.
有没有人把iPhone SDL端口放进去?它的效果如何?我可以期待这个项目有哪些问题,这个问题已经是iPhone的跨平台代码?
如果SDL不是一个选项,那么任何人都可以推荐一个替代框架,以便弥合SDL与OpenGL ES和Core Audio等本机库之间的差距吗?或者编码那些框架是最好的选择?
编辑添加:这是在UQM论坛上关于执行iPhone端口的论坛帖子的链接.
这是SDL计划:
#include <SDL/SDL.h>
int main(int argc, char** argv){
SDL_Init(SDL_INIT_VIDEO);
SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE);
SDL_Quit();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用命令编译:
g++ -o test test.cpp -lSDL
Run Code Online (Sandbox Code Playgroud)
这是valgrind的输出:
christian@christian-laptop:~/cpp/tetris$ valgrind --leak-check=full ./test
==3271== Memcheck, a memory error detector
==3271== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==3271== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info
==3271== Command: ./test
==3271==
==3271==
==3271== HEAP SUMMARY:
==3271== in use at exit: 91,097 bytes in 1,258 blocks
==3271== total …Run Code Online (Sandbox Code Playgroud) 我正在尝试关注Lazy Foo的教程.但是当我尝试运行他的一个例子时,我得到了这个编译错误:
错误:SDL/SDL_image.h:没有这样的文件或目录
编译器/链接器设置正确,我在Windows XP上使用Code :: Blocks.
但问题是,没有SDL_image.h.我已经检查了它应该是的文件夹.我试图再次下载SDL库并再次检查,仍然没有SDL_image.h文件.SDL_image.h文件在哪里?
我下载的库是Win32的'Development Libraries'下的'SDL-devel-1.2.14-mingw32.tar.gz',来自以下链接:http://www.libsdl.org/download-1.2.php