【问题标题】:SDL Draw Rect after Line Pixel issue线像素问题后的 SDL 绘制矩形
【发布时间】:2021-05-22 17:47:53
【问题描述】:

当我在 SDL 中绘制一条线后的矩形时,我在矩形右上角的顶部得到了一个像线一样颜色的像素。线条和矩形是否具有不同的颜色并不重要。画线后的矩形时,矩形的右上角总是有一个像素。

这是我的矩形代码:

SDL_Rect srcrect;

srcrect.x = 50;
srcrect.y = 50;
srcrect.w = 150;
srcrect.h = 80;

这是我绘制的代码:

SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
SDL_RenderClear(renderer);

SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
SDL_RenderDrawLine(renderer, 20, 20, 300, 300);
SDL_SetRenderDrawColor(renderer, 255, 0, 255, SDL_ALPHA_OPAQUE);
SDL_RenderDrawRect(renderer, &srcrect);
    
SDL_RenderPresent(renderer);

这是整个渲染的图片:

这是在矩形右上角放大的图片:

当我画线之前的矩形时,我没有这个问题。
有谁知道为什么会发生这种情况?

编辑:

当我绘制第二个矩形时,这个矩形上没有像素问题。它只在该行之后的第一个矩形上。

编辑 2:

我发现了一篇关于完全相同问题的帖子。还有SDL_CreateSoftwareRenderer() 的解决方案。链接在这里: What could be causing stray pixels to appear in my SDL2 program?

【问题讨论】:

  • 你能用SDL_CreateSoftwareRenderer()复制吗?
  • 使用 SoftwareRenderer 可以正常工作,但是有没有办法使用普通的SDL_CreateRenderer() 来解决这个问题?
  • got 一个selectionbugsdirect 你的时间/金钱在:)
  • 我查看了错误,但对我的问题没有帮助。
  • 您是否尝试将程序通过 RenderDoc 来查看各个 3D API(D3D?OpenGL?随便!)调用及其在帧缓冲区(即屏幕)上的结果?它至少会指出它发生的原因,如果不是如何解决它。

标签: c++ sdl sdl-2


【解决方案1】:

我不太确定可能是什么问题,也许是您的渲染器标志?窗户标志?有没有设置混合模式?即SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); 也许这会改变一些事情?就我个人而言,当我制作这个小程序时并没有改变任何东西。

#include <SDL2/SDL.h>


int main(int argc, char* argv[])
{

    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* window = SDL_CreateWindow("Test", 0, 30, 1280, 720, SDL_WINDOW_OPENGL);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

    SDL_Event event;
    bool running = true;


    SDL_Rect srcrect = {50,50,150,80};


    while (running)
    {

        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT){
                running = false;
                break;
            }
        }



        SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
        SDL_RenderClear(renderer);



        SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
        SDL_RenderDrawLine(renderer, 20, 20, 300, 300);

        SDL_SetRenderDrawColor(renderer, 255, 0, 255, SDL_ALPHA_OPAQUE);
        SDL_RenderDrawRect(renderer, &srcrect);



        SDL_RenderPresent(renderer);

    }


    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);

    SDL_Quit();


    return 0;
}

也许让这个程序运行一下,看看它是否有同样的问题。

【讨论】:

  • 在你的例子中,我遇到了完全相同的问题。
  • 可能是驱动问题,对我来说没有出现,也可能是 SDL2 版本问题?我会更新我的驱动程序并获得最新的 SDL2 版本,如果不是,可能是这些人工 gpu 问题之一,如果该代码不起作用,我看不出它是如何成为软件方面的问题。
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多