如何使用 SDL 2.0.9 创建 Direct3d 11 渲染器

2024-01-20

在我的项目中我必须使用SDL_BLENDOPERATION_MAXIMUM via SDL_ComposeCustomBlendMode()仅在 SDL 2.0.9 中由 direct3d11 渲染器支持。我有 Windows 8.1 和 GeForce GTX750 Ti,并更新了驱动程序。我的系统应该支持 DirectX 11 渲染。

更改定义于SDL_config.h or SDL_config_windows.h (SDL_VIDEO_RENDER_D3D11到 1 和SDL_VIDEO_RENDER_D3D到 0) 没有帮助。 我尝试根据 SDL 源代码使用定义的 SDL_VIDEO_RENDER_D3D11 或 WINRT 来填充预处理器定义。但这没有帮助。

我应该如何激活 direct3d11 渲染器以便可以使用最大混合模式?

我的测试代码:

#include "SDL.h"
#include "SDL_image.h"
#include <string>

using namespace std;

int main( int argc, char *argv[] ) {
    SDL_Init( SDL_INIT_VIDEO );
    IMG_Init( IMG_INIT_PNG );
    SDL_SetHintWithPriority( SDL_HINT_RENDER_DRIVER, "direct3d11", SDL_HINT_OVERRIDE );
    SDL_Window *window = SDL_CreateWindow( "Testing", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                                             1200, 600, SDL_WINDOW_RESIZABLE );
    SDL_Renderer *renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED );
    SDL_RendererInfo *rendererInfo = new SDL_RendererInfo();
    SDL_RendererInfo *driverInfo = new SDL_RendererInfo();
    SDL_GetRendererInfo( renderer, rendererInfo );
    int drivers = SDL_GetNumRenderDrivers();
    string availableDrivers = " (";
    for ( int i = 0; i < drivers; ++i ) {
        SDL_GetRenderDriverInfo( i, driverInfo );
        string driverName = driverInfo->name;
        if ( i == drivers - 1 ) {
            availableDrivers += driverName;
        }
        else {
            availableDrivers += driverName + ", ";
        }
    }
    availableDrivers += ")";
    string path = SDL_GetBasePath();
    SDL_Surface *surfRed = IMG_Load( (path + "\\Red.png").c_str() );
    SDL_Texture *textRed = SDL_CreateTextureFromSurface( renderer, surfRed );
    SDL_FreeSurface( surfRed );
    SDL_Surface *surfBlue = IMG_Load( ( path + "\\Blue.png" ).c_str() );
    SDL_Texture *textBlue = SDL_CreateTextureFromSurface( renderer, surfBlue );
    SDL_FreeSurface( surfBlue );
    SDL_Rect destRed, destBlue;
    destRed.x = 128;
    destRed.y = 128;
    destBlue.x = 196;
    destBlue.y = 196;
    SDL_QueryTexture( textRed, NULL, NULL, &destRed.w, &destRed.h );
    SDL_QueryTexture( textBlue, NULL, NULL, &destBlue.w, &destBlue.h );
    SDL_BlendMode blendMode = SDL_ComposeCustomBlendMode( SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_MAXIMUM,
        SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_MAXIMUM );         
    SDL_SetTextureBlendMode( textRed, blendMode );
    SDL_SetTextureBlendMode( textBlue, blendMode );
//  SDL_SetRenderDrawBlendMode( renderer, blendMode );
    string info = rendererInfo->name + availableDrivers + " " + SDL_GetError();
    SDL_SetWindowTitle( window, info.c_str() );
    SDL_SetRenderDrawColor( renderer, 0, 0, 0, 255 );
    SDL_Event event;
    bool isRunning = true;
    while ( isRunning ) {
        if ( SDL_PollEvent( &event ) ) {
            if ( event.type == SDL_QUIT ) {
                isRunning = false;
            }
        }
        SDL_RenderClear( renderer );
        SDL_RenderCopy( renderer, textRed, NULL, &destRed );
        SDL_RenderCopy( renderer, textBlue, NULL, &destBlue );
        SDL_RenderPresent( renderer );
    }
    delete driverInfo;
    delete rendererInfo;
    SDL_DestroyTexture( textRed );
    SDL_DestroyTexture( textBlue );
    SDL_DestroyRenderer( renderer );
    SDL_DestroyWindow( window );
    IMG_Quit();
    SDL_Quit();
    return 0;
}

窗口标题为“direct3d(direct3d、opengl、opengles2、软件)不支持此操作”。当我更改为 SDL_BLENDOPERATION_ADD 时它工作正常,但这不是我想要的。如果我取消注释渲染器混合模式,它也没有帮助。


  1. 通过枚举支持的渲染器后端SDL_GetNumRenderDrivers() and SDL_GetRenderDriverInfo().
  2. 请注意索引direct3d11驱动程序(如果存在)。
  3. 将索引传递到SDL_CreateRenderer().

全部一起:

SDL_Init( SDL_INIT_VIDEO );
SDL_Window* window = SDL_CreateWindow( "SDL2", 0, 0, 640, 480, SDL_WINDOW_SHOWN );

SDL_Renderer* renderer = nullptr;
for( int i = 0; i < SDL_GetNumRenderDrivers(); ++i )
{
    SDL_RendererInfo rendererInfo = {};
    SDL_GetRenderDriverInfo( i, &rendererInfo );
    if( rendererInfo.name != std::string( "direct3d11" ) )
    {
        continue;
    }

    renderer = SDL_CreateRenderer( window, i, 0 );
    break;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 SDL 2.0.9 创建 Direct3d 11 渲染器 的相关文章

随机推荐

  • 无法使用 pip 安装 Python 成像库

    尝试使用 PIP 安装 Python Imaging Library PIL 时 安装失败并出现以下错误 SyntaxError invalid syntax Complete output from command python setu
  • 没有找到类“androidx.core.widget.DrawerLayout”

    使用 Android Studio 菜单选项 Refactor gt Refactor to Androidx 迁移到 Androidx 包后 我的 build gradle 看起来像 implementation androidx app
  • facebook graph api 和 php sdk,删除事件!

    在我的一生中 我找不到一种方法来删除 取消或移除我使用 FB PHP SDK 和 Graph API 创建和更新的 Facebook 事件 我已经尝试了 facebook 文档和堆栈溢出中找到的每一个排列 以下是我在探索中发现的一些线索 h
  • 适合初学者的松耦合和面向对象实践

    保持类松散耦合是编写易于理解 修改和调试的代码的一个重要方面 我明白了 然而 作为一个新手 几乎任何时候我都很难超越最简单的例子 我或多或少地了解如何将字符串 整数和简单数据类型封装在它们自己的类中 然而 当我开始处理富文本格式等信息时 事
  • 在Linux上安装特定的adb版本

    我想使用特定的 adb 版本来连接设备 为了连接外部模拟器 我尝试使用adb connect localhost 5555 我得到这个结果 adb adb server version 36 doesn t match this clien
  • 如何在 Asp.Net Core 2.2 中禁用/启用运行时身份验证?

    网站默认只能匿名访问 管理员有一个按钮可以将站点切换到维护模式 这应该使用内置的 Cookie 身份验证启用授权 在数据库中稍微翻转一下 与本文无关 为了实现这一点 我首先配置了 cookie 身份验证 在startup cs中 publi
  • 如何在 MVC 3 中的 PartialView 加载上执行 JavaScript 函数

    code public ActionResult mapPartial DataTable dt string strEvents foreach DataRow row in dt Rows strEvents row Lat ToStr
  • dijit.byId 不适用于 IE8 和 dojo.addOnLoad

    当我使用 IE8 加载此脚本时 出现异常Object does not support this property or method 但它适用于其他浏览器 我用的是dijit 1 3 1 我不明白 dojo addOnLoad init
  • 如何将使用事务的代码包装在事务中然后回滚?

    我正在设置我的集成测试设备 我正在使用beforeEach and afterEach挂钩将每个测试包装在回滚的事务中 以便测试不会相互影响 一个简化的例子可能是这样的 const repository require library de
  • 如何从左到右解压元组?

    有没有一种干净 简单的方法来从左到右解压右侧的Python元组 例如对于 j 1 2 3 4 5 6 7 1 2 3 4 5 6 7 v b n j 4 7 我可以修改切片符号以便v j 6 b j 5 n j 4 我意识到我可以只订购左侧
  • React js:无法将数组中的第一个对象作为道具发送

    我正在尝试构建一个小型 React js 应用程序 我的组件结构如下所示 MainComponent CategoryList Category ItemsList Item 我的 MainContent 组件对其状态数据执行 ajax 请
  • 如何找到最接近的旋转

    考虑从 0 T 开始按递增顺序给出的点 Y 我们将这些点视为位于圆周 T 的圆上 现在考虑点 X 也来自 0 T 并且也位于圆周 T 的圆上 我们说 X 和 Y 之间的距离是 X 中每个点与其 Y 中最近点之间的绝对距离之和 回想一下 两者
  • 将滚动平均值与数据一起绘制

    我有一个看起来像这样的数据框 delays Worst case Avg case 2014 10 27 2 861433 0 953108 2014 10 28 2 899174 0 981917 2014 10 29 3 080738
  • 检测语言的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是否可以使用循环创建同一组件的多个实例?

    我有一个组件 Component CAU is port CLK in std logic RESET in std logic START in std logic V DIRECTION in vector 3d P ORIGIN in
  • 如何在 ZF2 中创建表单输入/元素

    编辑 我的主要问题现在变成了 如何以某种干净的方式将带有学说实体管理器的 ServiceManager 交到我的表单 元素和输入类手中 继续阅读以查看完整的帖子 我将尝试在这里举例询问 所以请耐心等待 让我知道哪里做错 对了 或者哪里可以改
  • 是否有用于布尔运算的内置“并行”函数?

    我正在寻找类似的功能pmax and pmin但对于布尔运算 例如 parallel and c TRUE TRUE TRUE TRUE c TRUE TRUE TRUE FALSE c TRUE TRUE FALSE TRUE c TRU
  • 在 C++ 中的结构上使用 memset

    我正在努力为我的工作修复旧代码 目前它是用 C 编写的 他们将静态分配转换为动态分配 但没有编辑 memsets memcmp memcpy 这是我的第一次编程实习 所以我的问题就像新手一样 以下代码是用 C 编写的 但我想用 C 编写 我
  • 使用 Python 更新 terraform (.tf) 文件

    我正在尝试使用 python 更新 terraform 模板 尽管我在尝试查找模块时遇到一些问题 例如使用 PyYAML 来更新 yml 文件 我的目标是更新 git 存储库中存在的 terraform 文件 并创建拉取请求 合并时将触发管
  • 如何使用 SDL 2.0.9 创建 Direct3d 11 渲染器

    在我的项目中我必须使用SDL BLENDOPERATION MAXIMUM via SDL ComposeCustomBlendMode 仅在 SDL 2 0 9 中由 direct3d11 渲染器支持 我有 Windows 8 1 和 G