-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SDL3: Successfully drawn, but no image displayed #12592
Comments
Remove the calls to |
Remove all calls to render present except for the last one. You asked about this multiple times on the forums and got the same answer. |
I'm not going to draw these four images all at once, I just wrote a demo and put them in one method. Actually, every time I draw, it's done in a different way, In my program, they are not in the same method, but are called sequentially in the same thread, so when I wrote the test demo again, I wrote them in the same method. |
You have to fill the entire screen between each present. The contents of frames after a present are undefined. The best way to simulate this is to follow each present with a clear to green. That way if the green color shows up you know that you haven’t drawn something correctly. |
If I only call persent at the end, I don't need to use targettexture, do I? I used Target Texture because I don't need them to draw it all at once. Just need them to quickly draw them one by one. |
Sorry, I missed that you were using a target texture. Can you copy and paste your demo code here so I can play with it tomorrow? |
https://github.com/PulpFiction98/SDL3_TargetTexture @slouken
Every time you click on the screen, there should be a momentary gray color, then quickly draw, with red in the upper left, green in the upper right, blue in the lower left, and white in the lower right. Is that right? |
Quote from
int main(void) {
printf("Hello world\n");
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *targetTexture;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("SDL3", 1920, 1080,SDL_WINDOW_RESIZABLE);
renderer = SDL_CreateRenderer(window,NULL);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
targetTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1920, 1080);
SDL_SetRenderTarget(renderer, targetTexture);
printf("%p\n", window);
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_EVENT_QUIT) {
break;
}
if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
printf("mouse button down\n");
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderTexture(renderer, targetTexture,NULL,NULL);
//SDL_RenderPresent(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
SDL_FRect frect=(SDL_FRect){0,0,1920/2,1080/2};
SDL_RenderTexture(renderer, targetTexture,NULL,&frect);
//SDL_RenderPresent(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
frect=(SDL_FRect){1920/2,0,1920/2,1080/2};
SDL_RenderTexture(renderer, targetTexture,NULL,&frect);
//SDL_RenderPresent(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
frect=(SDL_FRect){0,1080/2,1920/2,1080/2};
SDL_RenderTexture(renderer, targetTexture,NULL,&frect);
//SDL_RenderPresent(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
frect=(SDL_FRect){1920/2,1080/2,1920/2,1080/2};
SDL_RenderTexture(renderer, targetTexture,NULL,&frect);
//SDL_RenderPresent(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderPresent(renderer); // <==========
}
}
return 0;
} |
Oh my god, I'm using the target texture. I have a reason for writing this. The problem I am facing now is that the target texture of SDL3 has such an error, while I have also tried to write a similar demo for SDL2, but everything is normal. |
In real projects, they are not executed in one method, but in the same thread in sequence, so in the minimum demo, I put them in one method. |
Ah, I understand what's going on here. You're writing to the screen and you want each thing that you write to be seen in sequence. Most applications write the same (or similar thing) each frame, so it doesn't matter if some of the frames aren't seen, but in your case it does. The screen can only display things at the refresh rate of the monitor. So if your monitor has a 60 Hz refresh rate, the fastest you can display things is (1000 ms / 60 Hz), or 16.666666~ milliseconds apart. If your applications makes frames faster than that, then the graphics driver will just drop whatever won't be displayed. In your case, you don't want that, so setting Apologies for the misunderstanding! |
I will try this, but I actually have a question. In SDL2, I did not set up synchronization, and it runs perfectly (as can be seen in the SDL2 example I gave you in the GitHub project). Here, I want to know why there is no frame loss issue in SDL2, and whether I can achieve the same effect as SDL2 without setting synchronization. I discovered this problem when upgrading it to SDL3. I used another function (SDL_SetHint (SDL_INT-RENDER_VSYNC, "1")) to set vertical synchronization, which solved the problem of some frames not being displayed in the example I gave you. But in the real project, it had multiple cameras playing, and setting the SDL_SetHint function caused significant lag in my multi screen video playback. I will try the SDL_SetRenderVsync function tomorrow to see how it goes. If it's not possible, I will package my project in its entirety and send it to your email (including the code, instructions, and screen recording of any issues) |
Just like, one of my programs can play up to 25 cameras at the same time, each with 25 frames per second. When I used SDL2, I used it. Whenever a new frame from a certain camera comes, I draw it into the target texture and then submit the rendering using persent. It runs perfectly. 25 * 25=625 frames, I didn't set vertical synchronization and didn't feel any lag. Today, when I am using sdl3 without setting vertical synchronization, it can still play 25 frames smoothly. There was just a problem when I was initializing their background images. In order to solve the problem of frame loss during initialization, I used SDL_SetHint to set synchronization, which caused significant lag when playing my 25 images. |
Did SDL2 make any optimizations in this section? |
I'm looking at your code and you are running into the first issue we thought - you're not clearing the screen correctly. Here's code that demonstrates this - the magenta (purple) color is uninitialized memory, which may or may not be pixels you expect in practice: #include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#define printf SDL_Log
static void Present(SDL_Renderer* renderer)
{
SDL_RenderPresent(renderer);
SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255);
SDL_RenderClear(renderer);
}
int main(int argc, char *argv[])
{
printf("Hello world\n");
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *targetTexture;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("SDL3", 1920, 1080, SDL_WINDOW_RESIZABLE);
renderer = SDL_CreateRenderer(window, NULL);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
targetTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1920, 1080);
SDL_SetRenderTarget(renderer, targetTexture);
printf("%p\n", window);
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_EVENT_QUIT) {
break;
}
if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
printf("mouse button down\n");
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderTexture(renderer, targetTexture, NULL, NULL);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
SDL_FRect frect = (SDL_FRect){ 0, 0, 1920 / 2, 1080 / 2 };
SDL_RenderTexture(renderer, targetTexture, NULL, &frect);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
frect = (SDL_FRect){ 1920 / 2, 0, 1920 / 2, 1080 / 2 };
SDL_RenderTexture(renderer, targetTexture, NULL, &frect);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
frect = (SDL_FRect){ 0, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_RenderTexture(renderer, targetTexture, NULL, &frect);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
frect = (SDL_FRect){ 1920 / 2, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_RenderTexture(renderer, targetTexture, NULL, &frect);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderTarget(renderer, NULL); // <==========
Present(renderer); // <==========
}
}
return 0;
} I'll change this example to do what you want shortly. |
Here is code that does what you want. Note that we're always drawing into the render target, but we set the viewport to set the area of the render target that we want to draw into. Then we always (always!) copy the entire render target to the screen before presenting. #include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#define printf SDL_Log
static void Present(SDL_Renderer* renderer)
{
SDL_RenderPresent(renderer);
SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255);
SDL_RenderClear(renderer);
}
int main(int argc, char *argv[])
{
printf("Hello world\n");
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *targetTexture;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("SDL3", 1920, 1080, SDL_WINDOW_RESIZABLE);
renderer = SDL_CreateRenderer(window, NULL);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
Present(renderer);
targetTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1920, 1080);
SDL_SetRenderTarget(renderer, targetTexture);
printf("%p\n", window);
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_EVENT_QUIT) {
break;
}
if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
printf("mouse button down\n");
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_SetRenderViewport(renderer, NULL);
SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderTexture(renderer, targetTexture, NULL, NULL);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_Rect rect = (SDL_Rect){ 0, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderTexture(renderer, targetTexture, NULL, NULL);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
rect = (SDL_Rect){ 1920 / 2, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderTexture(renderer, targetTexture, NULL, NULL);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
rect = (SDL_Rect){ 0, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderTexture(renderer, targetTexture, NULL, NULL);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
rect = (SDL_Rect){ 1920 / 2, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderTexture(renderer, targetTexture, NULL, NULL);
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer); // <==========
}
}
return 0;
} |
Also note that you can entirely omit the intermediate present calls: #include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#define printf SDL_Log
static void Present(SDL_Renderer *renderer)
{
SDL_RenderPresent(renderer);
SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255);
SDL_RenderClear(renderer);
}
int main(int argc, char *argv[])
{
printf("Hello world\n");
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *targetTexture;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("SDL3", 1920, 1080, SDL_WINDOW_RESIZABLE);
renderer = SDL_CreateRenderer(window, NULL);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
Present(renderer);
targetTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1920, 1080);
printf("%p\n", window);
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_EVENT_QUIT) {
break;
}
if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
printf("mouse button down\n");
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_SetRenderViewport(renderer, NULL);
SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_Rect rect = (SDL_Rect){ 0, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 1920 / 2, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 0, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 1920 / 2, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer); // <==========
}
}
return 0;
} |
Also note that when you are using the render target, you don't have to draw the entire thing. The areas you don't draw will remain what was drawn previously, which is the behavior you want: #include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#define printf SDL_Log
const bool debug = true;
static void Present(SDL_Renderer *renderer)
{
SDL_RenderPresent(renderer);
if (debug) {
SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255); // <=== if you see this color (magenta), you haven't drawn the whole frame
SDL_RenderClear(renderer);
}
}
int main(int argc, char *argv[])
{
printf("Hello world\n");
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *targetTexture;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("SDL3", 1920, 1080, SDL_WINDOW_RESIZABLE);
renderer = SDL_CreateRenderer(window, NULL);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
Present(renderer);
targetTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1920, 1080);
printf("%p\n", window);
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_EVENT_QUIT) {
break;
}
if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
printf("mouse button down\n");
if (event.button.button == SDL_BUTTON_LEFT) {
printf("left button, drawing all four squares\n");
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_SetRenderViewport(renderer, NULL);
SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_Rect rect = (SDL_Rect){ 0, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 1920 / 2, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 0, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 1920 / 2, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer); // <==========
} else if (event.button.button == SDL_BUTTON_RIGHT) {
printf("right button, drawing one square\n");
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_Rect rect = (SDL_Rect){ 1920 / 2, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 230, 128, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer); // <==========
}
}
}
return 0;
} |
The areas you don't draw will remain what was drawn previously, Yes Yes Yes,What I want is this, I really want to try it now, damn time difference. I will try it as soon as possible after work, thank you again. |
You're welcome! |
I just tried your code and carefully understood it. I don't think this is what I wanted, so I made some minor modifications to it. |
Enabling vertical synchronization will solve the issue of no show, but there will be noticeable lag during video playback |
Interesting, I am able to reproduce what you're seeing when spamming the right mouse button. I'm investigating... |
So this appears to be a bug in the direct3d11 driver. SDL2 uses the direct3d driver by default, which is why you're seeing it now and not before. Testing the different drivers, it looks like this bug only happens on the direct3d11 driver, all the others work correctly. I'm investigating... |
thanks thanks |
I'm not sure what's happening here, but in the meantime you can create the renderer with "direct3d" as the name of the renderer to get the original renderer that you had before. |
For future reference, this is the complete test case, and the issue is sometimes the final color on the screen is red when spamming right clicks: #include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#define printf SDL_Log
const bool debug = true;
static void Present(SDL_Renderer *renderer)
{
SDL_RenderPresent(renderer);
if (debug) {
SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255); // <=== if you see this color (magenta), you haven't drawn the whole frame
SDL_RenderClear(renderer);
}
}
int main(int argc, char *argv[])
{
printf("Hello world\n");
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *targetTexture;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
SDL_SetHint(SDL_HINT_RENDER_DIRECT3D11_DEBUG, "1");
window = SDL_CreateWindow("SDL3", 1920, 1080, SDL_WINDOW_RESIZABLE);
renderer = SDL_CreateRenderer(window, "direct3d11");
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
Present(renderer);
targetTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1920, 1080);
printf("%p\n", window);
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_EVENT_QUIT) {
break;
}
if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
printf("mouse button down\n");
if (event.button.button == SDL_BUTTON_LEFT) {
printf("left button, drawing all four squares\n");
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_SetRenderViewport(renderer, NULL);
SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_Rect rect = (SDL_Rect){ 0, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 1920 / 2, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 0, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderFillRect(renderer, NULL);
rect = (SDL_Rect){ 1920 / 2, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer); // <==========
} else if (event.button.button == SDL_BUTTON_RIGHT) {
printf("right button, drawing one square\n");
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer); // <==========
SDL_SetRenderTarget(renderer, targetTexture); // <==========
SDL_Rect rect = (SDL_Rect){ 0, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 230, 128, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer); // <==========
SDL_SetRenderTarget(renderer, targetTexture); // <==========
rect = (SDL_Rect){ 1920 / 2, 0, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 0, 128, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture); // <==========
rect = (SDL_Rect){ 0, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 128, 0, 128, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer);
SDL_SetRenderTarget(renderer, targetTexture); // <==========
rect = (SDL_Rect){ 1920 / 2, 1080 / 2, 1920 / 2, 1080 / 2 };
SDL_SetRenderViewport(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 255, 128, 0, 255);
SDL_RenderFillRect(renderer, NULL);
SDL_SetRenderTarget(renderer, NULL); // <==========
SDL_RenderTexture(renderer, targetTexture, NULL, NULL); // <==== copy to screen before present!
Present(renderer);
}
}
}
return 0;
} |
Yes, after specifying direct3d in my project, there has been no frame loss phenomenon. |
Great! |
Click the button, clear the screen, and then draw four times, each time drawing an image on top of the original. But there is a probability that the image cannot be drawn. Did I make a mistake?
The text was updated successfully, but these errors were encountered: