归一化UV坐标

This commit is contained in:
Nanako 2024-11-22 10:28:00 +08:00
parent 8d1bb03372
commit aed0083122
3 changed files with 26 additions and 14 deletions

View File

@ -32,7 +32,7 @@ function(compile_slang_shaders input_file stage entry_point)
set(output_file ${output_dir}/${filename}_${entry_point}.glsl) set(output_file ${output_dir}/${filename}_${entry_point}.glsl)
add_custom_command( add_custom_command(
OUTPUT ${output_file} OUTPUT ${output_file}
COMMAND slangc -target glsl -entry ${entry_point} -stage ${stage} ${extra_args} -o ${output_file} ${input_file} COMMAND slangc -target glsl -entry ${entry_point} -stage ${stage} ${extra_args} -o ${output_file} ${input_file} -DUSE_OPENGL=1 -DUV_FLIP=1
DEPENDS ${input_file} DEPENDS ${input_file}
COMMENT "Compiling ${input_file} to GLSL (${stage}, ${entry_point})" COMMENT "Compiling ${input_file} to GLSL (${stage}, ${entry_point})"
) )
@ -43,7 +43,7 @@ function(compile_slang_shaders input_file stage entry_point)
set(output_file ${output_dir}/${filename}_${entry_point}.dxbc) set(output_file ${output_dir}/${filename}_${entry_point}.dxbc)
add_custom_command( add_custom_command(
OUTPUT ${output_file} OUTPUT ${output_file}
COMMAND slangc -target dxbc -profile ${profile} -entry ${entry_point} -stage ${stage} ${extra_args} -o ${output_file} ${input_file} COMMAND slangc -target dxbc -profile ${profile} -entry ${entry_point} -stage ${stage} ${extra_args} -o ${output_file} ${input_file} -DUSE_DX=1
DEPENDS ${input_file} DEPENDS ${input_file}
COMMENT "Compiling ${input_file} to DXBC (${stage}, ${entry_point}) with profile ${profile}" COMMENT "Compiling ${input_file} to DXBC (${stage}, ${entry_point}) with profile ${profile}"
) )
@ -54,7 +54,7 @@ function(compile_slang_shaders input_file stage entry_point)
set(output_file ${output_dir}/${filename}_${entry_point}.spirv) set(output_file ${output_dir}/${filename}_${entry_point}.spirv)
add_custom_command( add_custom_command(
OUTPUT ${output_file} OUTPUT ${output_file}
COMMAND slangc -target spirv -entry ${entry_point} -stage ${stage} ${extra_args} -o ${output_file} ${input_file} COMMAND slangc -target spirv -entry ${entry_point} -stage ${stage} ${extra_args} -o ${output_file} ${input_file} -DUSE_VULKAN=1 -DUV_FLIP=1
DEPENDS ${input_file} DEPENDS ${input_file}
COMMENT "Compiling ${input_file} to SPIR-V (${stage}, ${entry_point})" COMMENT "Compiling ${input_file} to SPIR-V (${stage}, ${entry_point})"
) )
@ -65,7 +65,7 @@ function(compile_slang_shaders input_file stage entry_point)
set(output_file ${output_dir}/${filename}_${entry_point}.metal) set(output_file ${output_dir}/${filename}_${entry_point}.metal)
add_custom_command( add_custom_command(
OUTPUT ${output_file} OUTPUT ${output_file}
COMMAND slangc -target msl -entry ${entry_point} -stage ${stage} ${extra_args} -o ${output_file} ${input_file} COMMAND slangc -target msl -entry ${entry_point} -stage ${stage} ${extra_args} -o ${output_file} ${input_file} -DUSE_METAL=1
DEPENDS ${input_file} DEPENDS ${input_file}
COMMENT "Compiling ${input_file} to Metal Shading Language (${stage}, ${entry_point})" COMMENT "Compiling ${input_file} to Metal Shading Language (${stage}, ${entry_point})"
) )

View File

@ -14,13 +14,10 @@ void renderer_context::draw_rectangle(const Eigen::Vector2f& in_pos, const Eigen
void renderer_context::draw_rounded_rectangle(const Eigen::Vector2f& in_pos, const Eigen::Vector2f& in_size, const linear_color& in_color, float in_angle, const rect_radius& in_radius) { void renderer_context::draw_rounded_rectangle(const Eigen::Vector2f& in_pos, const Eigen::Vector2f& in_size, const linear_color& in_color, float in_angle, const rect_radius& in_radius) {
to_rounded_rect_pipeline(in_pos, in_size, in_radius); to_rounded_rect_pipeline(in_pos, in_size, in_radius);
// in_angle传入的是角度, 需要转换为弧度 // in_angle传入的是角度, 需要转换为弧度
#define M_PI 3.14159265358979323846
in_angle = in_angle * M_PI / 180; in_angle = in_angle * M_PI / 180;
make_rect(in_pos, in_size, in_color, in_angle); make_rect(in_pos, in_size, in_color, in_angle);
if (in_angle != 0) {
auto center = in_pos + in_size / 2;
rotate_vertex(in_angle, center);
}
// 立刻绘制并重置管线, 因为下一个绘制命令的参数可能不同, 所以无法合批 // 立刻绘制并重置管线, 因为下一个绘制命令的参数可能不同, 所以无法合批
flush(); flush();
} }
@ -90,10 +87,23 @@ void renderer_context::to_segment_pipeline(const Eigen::Vector2f& in_pos_p1, con
void renderer_context::make_rect(const Eigen::Vector2f& in_pos, const Eigen::Vector2f& in_size, void renderer_context::make_rect(const Eigen::Vector2f& in_pos, const Eigen::Vector2f& in_size,
const linear_color& in_color, float in_angle) { const linear_color& in_color, float in_angle) {
const aorii_vertex v1{ { in_pos.x(), in_pos.y() }, { -1, 1 }, in_color }; // 左上角 aorii_vertex v1{ { in_pos.x(), in_pos.y() }, { 0, 0 }, in_color }; // 左上角
const aorii_vertex v2{ { in_pos.x() + in_size.x(), in_pos.y() }, { 1, 1 }, in_color }; // 右上角 aorii_vertex v2{ { in_pos.x() + in_size.x(), in_pos.y() }, { 1, 0 }, in_color }; // 右上角
const aorii_vertex v3{ { in_pos.x(), in_pos.y() + in_size.y() }, { -1, -1 }, in_color }; // 左下角 aorii_vertex v3{ { in_pos.x(), in_pos.y() + in_size.y() }, { 0, 1 }, in_color }; // 左下角
const aorii_vertex v4{ { in_pos.x() + in_size.x(), in_pos.y() + in_size.y() }, { 1, -1 }, in_color }; // 右下角 aorii_vertex v4{ { in_pos.x() + in_size.x(), in_pos.y() + in_size.y() }, { 1, 1 }, in_color }; // 右下角
if (in_angle != 0) {
auto center = in_pos + in_size / 2;
const Eigen::Affine2f transform =
Eigen::Translation<float, 2>(center) * // 平移到旋转中心
Eigen::Rotation2D<float>(in_angle) * // 旋转
Eigen::Translation<float, 2>(-center); // 平移回原点
v1.position = transform * v1.position;
v2.position = transform * v2.position;
v3.position = transform * v3.position;
v4.position = transform * v4.position;
}
const uint32_t index1 = vertices.size(); const uint32_t index1 = vertices.size();
vertices.push_back(v1); vertices.push_back(v1);

View File

@ -1,3 +1,5 @@
#include "aorii_util.slang"
cbuffer ParamBuffer : register(b0) cbuffer ParamBuffer : register(b0)
{ {
matrix transform; matrix transform;
@ -38,11 +40,11 @@ float distance_from_rect_uv(float2 p, float corner_radius) {
float4 pixel_main(PSInput input) : SV_Target float4 pixel_main(PSInput input) : SV_Target
{ {
float2 p = input.uv; float2 p = uv_to_ndc(input.uv);
// 象限 // 象限
int2 quadrant = sign(p); int2 quadrant = sign(p);
int idx = (quadrant.x > 0 ? 1 : 0) + (quadrant.y > 0 ? 0 : 2); int idx = (quadrant.x > 0 ? 1 : 0) + (quadrant.y > 0 ? 2 : 0);
float r = radius[idx]; float r = radius[idx];
float d = distance_from_rect_uv(p, r); float d = distance_from_rect_uv(p, r);