栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[C++] [Raylib] 着色器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[C++] [Raylib] 着色器

额

raylib貌似不自带光照,还要自己写
可以参考官方光照示例

代码

先来一打非常简单的着色器
顶点属性名最好按照官方wiki上写的,编译时raylib会自动加载
4.vert

#version 330

layout(location=0)in vec3 vertexPosition;
layout(location=1)in vec3 vertexNormal;
layout(location=2)in vec4 vertexColor;

out vec3 fragPosition;
out vec3 fragNormal;
out vec3 fragColor;

uniform mat4 mvp;
uniform mat4 matModel;

void main()
{
	gl_Position = mvp * vec4(vertexPosition,1.0);
	fragPosition = vec3(matModel * vec4(vertexPosition,1.0));
	fragNormal = vec3(matModel * vec4(vertexNormal,1.0));
	fragColor = vec3(vertexColor);
}

4.frag

#version 330

in vec3 fragPosition;
in vec3 fragNormal;
in vec3 fragColor;

out vec4 finalColor;

uniform vec3 u_color;
uniform vec3 u_cameraposition;

void main()
{
	finalColor = vec4(u_color,1.0);
}

03.cpp

#include 
#include 
#include 

int main()
{
	//把角度转换为弧度
	auto toRad = [](float deg)
	{
		return (deg * 3.1415f / 180.0f);
	};

	//初始化窗口
	InitWindow(500, 500, "");
	SetTargetFPS(60);

	//初始化相机
	Camera3D camera;
	camera.fovy = 60.0f;
	camera.position = {5, 5, 5};
	camera.projection = CameraProjection::CAMERA_PERSPECTIVE;
	camera.target = {0, 0, 0};
	camera.up = {0, 1, 0};
	UpdateCamera(&camera);
	float angle = 0.0f;

	//加载着色器
	Shader shader = LoadShader("resources/4.vert", "resources/4.frag");
	//让raylib填充相机位置(???)
	shader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(shader, "u_cameraposition");
	//获取u_color的位置
	int u_color = GetShaderLocation(shader, "u_color");


	//加载模型
	Model cube = LoadModel("resources/cube.obj");
	//设置着色器
	cube.materials[0].shader = shader;
	//颜色
	float red[] = {1, 0, 0};

	Model sphere = LoadModel("resources/sphere.obj");
	sphere.materials[0].shader = shader;
	float green[] = {0, 1, 0};

	Model annulus = LoadModel("resources/annulus.obj");
	annulus.materials[0].shader = shader;
	float blue[] = {0, 0, 1};

	while (!WindowShouldClose())
	{
		BeginDrawing();
		{
			ClearBackground(BLACK);

			//移动相机
			const float radius = sqrt(5 * 5 + 5 * 5);
			float x = cos(toRad(angle)) * radius;
			float z = sin(toRad(angle)) * radius;
			camera.position = {x, 5, z};
			UpdateCamera(&camera);

			angle += 1.0f;
			if (angle >= 360.0f) angle -= 360.0f;

			BeginMode3D(camera);
			{
				DrawGrid(10, 1);

				//启用着色器
				BeginShaderMode(shader);
				{
					//设置颜色
					SetShaderValue(shader, u_color, red, SHADER_UNIFORM_VEC3);
					//绘制模型
					DrawModel(cube, Vector3{0, 0, 2}, 1, BLACK);
					SetShaderValue(shader, u_color, green, SHADER_UNIFORM_VEC3);
					DrawModel(sphere, Vector3{-2, 0, -2}, 1, BLACK);
					SetShaderValue(shader, u_color, blue, SHADER_UNIFORM_VEC3);
					DrawModel(annulus, Vector3{2, 0, -2}, 1, BLACK);
				}
				EndShaderMode();
			}
			EndMode3D();

			DrawFPS(0, 0);
		}
		EndDrawing();
	}

	//清空资源
	UnloadShader(shader);
	UnloadModel(cube);
	UnloadModel(sphere);
	UnloadModel(annulus);
	
	//关闭窗口
	CloseWindow();
	return 0;
}
运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号