我有一个使用SDL2编写的游戏,并使用SDL2渲染器(硬件加速)进行绘制。有没有什么技巧可以画填充的四边形或三角形?
目前我只是通过绘制很多线段(SDL_Drawlines)来填充它们,但性能很差。
我不想使用OpenGL。
我有一个使用SDL2编写的游戏,并使用SDL2渲染器(硬件加速)进行绘制。有没有什么技巧可以画填充的四边形或三角形?
目前我只是通过绘制很多线段(SDL_Drawlines)来填充它们,但性能很差。
我不想使用OpenGL。
SDL_RenderGeometry()
/SDL_RenderGeometryRaw()
是在SDL 2.0.18中添加的:
- 添加了
SDL_RenderGeometry()
和SDL_RenderGeometryRaw()
,允许使用SDL 2D渲染API来渲染任意形状
示例:
// g++ main.cpp `pkg-config --cflags --libs sdl2`
#include <SDL.h>
#include <vector>
int main( int argc, char** argv )
{
SDL_Init( SDL_INIT_EVERYTHING );
SDL_Window* window = SDL_CreateWindow("SDL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN );
SDL_Renderer* renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );
const std::vector< SDL_Vertex > verts =
{
{ SDL_FPoint{ 400, 150 }, SDL_Color{ 255, 0, 0, 255 }, SDL_FPoint{ 0 }, },
{ SDL_FPoint{ 200, 450 }, SDL_Color{ 0, 0, 255, 255 }, SDL_FPoint{ 0 }, },
{ SDL_FPoint{ 600, 450 }, SDL_Color{ 0, 255, 0, 255 }, SDL_FPoint{ 0 }, },
};
bool running = true;
while( running )
{
SDL_Event ev;
while( SDL_PollEvent( &ev ) )
{
if( ( SDL_QUIT == ev.type ) ||
( SDL_KEYDOWN == ev.type && SDL_SCANCODE_ESCAPE == ev.key.keysym.scancode ) )
{
running = false;
break;
}
}
SDL_SetRenderDrawColor( renderer, 0, 0, 0, SDL_ALPHA_OPAQUE );
SDL_RenderClear( renderer );
SDL_RenderGeometry( renderer, nullptr, verts.data(), verts.size(), nullptr, 0 );
SDL_RenderPresent( renderer );
}
SDL_DestroyRenderer( renderer );
SDL_DestroyWindow( window );
SDL_Quit();
return 0;
}
请注意,由于API缺少仅针对Z坐标的数据通道,因此只有仿射纹理映射可以实现。
这是我的基本示例:
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
int width=1280,height=720;
SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
SDL_Event e;
SDL_Vertex triangleVertex[3]=
{
{
{ 0,0}, /* first point location */
{ 255, 0, 0, 0xFF }, /* first color */
{ 0.f, 0.f }
},
{
{ 0, 720 }, /* second point location */
{ 0,255,0, 0xFF }, /* second color */
{ 0.f, 0.f }
},
{
{ 640, 360 }, /* third point location */
{ 0,0,255, 0xFF }, /* third color */
{ 0.f, 0.f }
}
};
int main(int argc, char** argv)
{
if(SDL_Init(SDL_INIT_VIDEO)){printf( "SDL could not initialize! SDL_Error: %s\n",SDL_GetError());return -1;}
window = SDL_CreateWindow( "SDL Chaste Triangle",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,width,height,0);
if(window==NULL){printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );return -1;}
renderer = SDL_CreateRenderer(window,-1,0);
if(renderer==NULL){printf( "Renderer could not be created! SDL_Error: %s\n", SDL_GetError() );return -1;}
SDL_SetRenderDrawColor(renderer,0,0,0,255);
SDL_RenderClear(renderer);
if( SDL_RenderGeometry(renderer, NULL, triangleVertex, 3, NULL, 0) < 0 ) {SDL_Log("%s\n", SDL_GetError());}
SDL_RenderPresent(renderer);
while(e.type != SDL_KEYUP && e.type != SDL_QUIT) /*wait until any key is pressed and then released*/
{
SDL_PollEvent( &e );
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
/*
This file is the Chastity's modification of an example from here:
https://daywithstars.github.io/sdl2/geometry/2021/12/03/SDL2-new-geometry-rendering-SDL_RenderGeometry.html
Unlike the original, this one is compatible with the C89 standard which Chastity always uses.
Compile and run on Linux with this command:
gcc -Wall -ansi -pedantic main.c -o main `sdl2-config --cflags --libs` -lm && ./main
*/
我在我的Github项目中有这个例子和更多的例子。
https://github.com/chastitywhiterose/SDL_Chaste_Triangle
只要有足够多的三角形,就可以绘制任何形状。因此,我制作了这个项目,以帮助我在未来制作游戏时使用。