绘制转动的三角形

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "GLRenderer.h"
int main() {
InitWindow(800, 600, "Clean OpenGL Wrapper");
SetTargetFPS(60);

float rotation = 0.0f;

while (!WindowShouldClose()) {
rotation += 2.0f;

BeginDrawing();
ClearBackground(DARKGRAY);

// 使用封装后的逻辑
GLRenderer::Begin();
GLRenderer::DrawTestTriangle(400, 300, 100, rotation);
// 这里你还可以直接写其他的 rlBegin / rlVertex 代码
GLRenderer::End();

DrawFPS(10, 10);
EndDrawing();
}

CloseWindow();
return 0;
}

GLRenderer.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
#include "raylib.h"
#include "rlgl.h"

class GLRenderer {
public:
// 开启底层 GL 绘制模式,自动处理状态重置
static void Begin();

// 结束绘制,恢复 Raylib 原始状态
static void End();

// 封装常用的底层绘图动作
static void DrawTestTriangle(float x, float y, float size, float rotation);
};

GLRenderer.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "GLRenderer.h"

void GLRenderer::Begin() {
// 1. 强制提交 Raylib 之前的批处理
rlDrawRenderBatchActive();

// 2. 激活默认着色器,解决“不显示”的核心问题
rlEnableShader(rlGetShaderIdDefault());

// 3. 进入矩阵保护
rlPushMatrix();
rlMatrixMode(RL_MODELVIEW);
rlLoadIdentity();

// 4. 彻底清理状态污染
rlDisableTexture(); // 禁用纹理
rlDisableBackfaceCulling(); // 禁用背面剔除
rlDisableDepthTest(); // 2.0 模式下确保不被深度遮挡
}

void GLRenderer::End() {
// 强制提交当前的底层绘图
rlDrawRenderBatchActive();

// 恢复矩阵和着色器
rlPopMatrix();
rlDisableShader();
}

void GLRenderer::DrawTestTriangle(float x, float y, float size, float rotation) {
rlPushMatrix();
rlTranslatef(x, y, 0);
rlRotatef(rotation, 0, 0, 1);

rlBegin(RL_TRIANGLES);
rlColor4ub(255, 0, 0, 255); rlVertex2f(0, -size);
rlColor4ub(0, 255, 0, 255); rlVertex2f(size, size);
rlColor4ub(0, 0, 255, 255); rlVertex2f(-size, size);
rlEnd();
rlPopMatrix();
}

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
cmake_minimum_required(VERSION 3.20)
project(GlDemo LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)

# 1. 强制编译器使用 UTF-8 处理源代码(解决代码页 936 警告)
if(MSVC)
add_compile_options("/utf-8")
endif()

# 2. 设置路径
set(VCPKG_ROOT "C:/D/test/CCpp/ccpplib/vcpkg/vcpkg/installed/x64-windows")
include_directories("${VCPKG_ROOT}/include")
link_directories("${VCPKG_ROOT}/lib")

# 5. 输出目录 (放在 add_executable 之前最稳妥)
# 设置所有类型的输出根目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# 针对多配置生成器(VS/Ninja),强制取消 Debug/Release 子目录
foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG_UPPER)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} ${CMAKE_BINARY_DIR}/bin)
endforeach()

# 3. 包含所有源文件 (关键修复:必须包含 GLRenderer 的实现文件)
# 请确保文件名与你实际的文件名一致
add_executable(${PROJECT_NAME}
main.cpp
GLRenderer.cpp
)

# 4. 链接库
# raylib 通常需要 winmm 和 gdi32 等系统库
target_link_libraries(${PROJECT_NAME} PRIVATE
raylib
opengl32
winmm
gdi32
user32
shell32
)


# 5. 输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# 1. 定义一个函数来按需拷贝 DLL
function(copy_required_dlls TARGET_NAME VCPKG_BIN_DIR)
# 获取当前 target 的输出目录(绝对路径)
# 使用 get_target_property 获取你在上面 set 好的输出路径
get_target_property(TARGET_OUT_DIR ${TARGET_NAME} RUNTIME_OUTPUT_DIRECTORY)

# 如果没设置属性,就回退到默认的 CMAKE_RUNTIME_OUTPUT_DIRECTORY
if(NOT TARGET_OUT_DIR)
set(TARGET_OUT_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
endif()

add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/copy_dlls.cmake"
COMMENT "正在按需拷贝库文件到: ${TARGET_OUT_DIR}"
)

# 2. 这里的关键是:直接把变量值写进去,而不是写生成表达式
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/copy_dlls.cmake" "
set(SEARCH_DLLS \"raylib.dll\" \"glfw3.dll\")
set(SRC_DIR \"${VCPKG_BIN_DIR}\")
set(DST_DIR \"${TARGET_OUT_DIR}\")

foreach(DLL_NAME \${SEARCH_DLLS})
if(EXISTS \"\${SRC_DIR}/\${DLL_NAME}\")
file(COPY \"\${SRC_DIR}/\${DLL_NAME}\" DESTINATION \"\${DST_DIR}\")
message(STATUS \"[AutoCopy] 已拷贝: \${DLL_NAME}\")
else()
message(WARNING \"[AutoCopy] 未找到依赖库: \${DLL_NAME}\")
endif()
endforeach()
")
endfunction()

# 3. 调用
copy_required_dlls(${PROJECT_NAME} "${VCPKG_ROOT}/bin")