跟随chatgpt学习如何使用GLSL进行简单的图形渲染

这篇具有很好参考价值的文章主要介绍了跟随chatgpt学习如何使用GLSL进行简单的图形渲染。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 准备一个HTML文件:创建一个新的HTML文件,将 HTML 文件命名为 `index.html`,并添加一个用于显示图形的<canvas>元素。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Simple WebGL Rendering</title>
    <style>
        body { margin: 0; }
        canvas { width: 100%; height: 100%; }
    </style>
</head>
<body>
    <canvas id="canvas"></canvas>
    <script src="script.js"></script>
</body>
</html>

2. 创建JavaScript文件:创建一个名为`script.js`的 JavaScript 文件来处理图形的渲染逻辑。

// 获取canvas元素
const canvas = document.getElementById("canvas");

// 创建WebGL上下文
const gl = canvas.getContext("webgl");

// 定义顶点着色器代码
const vertexShaderSource = `
    attribute vec2 position;
    
    void main() {
        gl_Position = vec4(position, 0.0, 1.0);
    }
`;

// 创建顶点着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

// 检查顶点着色器是否编译成功
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
    console.error("Vertex shader compilation error:", gl.getShaderInfoLog(vertexShader));
}

// 定义片段着色器代码
const fragmentShaderSource = `
    precision mediump float;
    
    void main() {
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    }
`;

// 创建片段着色器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

// 检查片段着色器是否编译成功
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
    console.error("Fragment shader compilation error:", gl.getShaderInfoLog(fragmentShader));
}

// 创建着色器程序
const shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);

// 使用着色器程序
gl.useProgram(shaderProgram);

// 渲染图形
const vertices = [-0.5, -0.5,
    0.5, -0.5,
    0.0, 0.5
];

const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

const positionAttributeLocation = gl.getAttribLocation(shaderProgram, "position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 3);

运行成功页面

跟随chatgpt学习如何使用GLSL进行简单的图形渲染,学习,图形渲染

一个简单的glsl小实验成功了,不过我想要这个三角形动起来。

修改后的script代码如下

// 获取画布元素和 WebGL 上下文
var canvas = document.getElementById("canvas");
var gl = canvas.getContext("webgl");

// 顶点着色器代码
const vertexShaderSource = `
    attribute vec2 a_position;
    uniform vec2 u_translation;

    void main() {
        gl_Position = vec4(a_position + u_translation, 0, 1);
    }
`;

// 片段着色器代码
const fragmentShaderSource = `
    precision mediump float;

    void main() {
        gl_FragColor = vec4(1, 0, 0, 1);
    }
`;

// 创建着色器程序
var program = createProgram(gl, vertexShaderSource, fragmentShaderSource);

// 获取顶点位置 attribute 的位置
var positionAttributeLocation = gl.getAttribLocation(program, "a_position");

// 创建并绑定顶点缓冲区
var positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);

// 定义一个简单的三角形顶点位置数组
var positions = [
    0, 0,
    -0.5, -0.5,
    0.5, -0.5
];

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);

// 设置顶点属性指针
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

// 清空画布
gl.clearColor(0, 0, 0, 1);

// 设置着色器程序
gl.useProgram(program);

// 获取着色器程序中 uniform 变量的位置
var translationUniformLocation = gl.getUniformLocation(program, "u_translation");

// 更新平移向量
function updateTranslation() {
    var time = new Date().getTime() * 0.001; // 获取时间并转换为秒
    var translation = [
        Math.sin(time), // x 轴上的移动,使用正弦函数模拟
        Math.cos(time)  // y 轴上的移动,使用余弦函数模拟
    ];
    gl.uniform2fv(translationUniformLocation, translation);
}

// 动画循环
function animate() {
    // 清空画布
    gl.clear(gl.COLOR_BUFFER_BIT);

    // 绘制三角形
    gl.drawArrays(gl.TRIANGLES, 0, 3);

    // 更新平移向量
    updateTranslation();

    // 请求下一次动画循环
    requestAnimationFrame(animate);
}

// 开始动画循环
animate();

// 创建着色器程序的函数
function createProgram(gl, vertexShaderSource, fragmentShaderSource) {
    // 创建顶点着色器和片段着色器
    var vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
    var fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);

    // 创建着色器程序
    var program = gl.createProgram();

    // 附加着色器到着色器程序
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);

    // 链接着色器程序
    gl.linkProgram(program);

    // 检查链接状态
    var success = gl.getProgramParameter(program, gl.LINK_STATUS);
    if (success) {
        return program;
    }

    // 链接错误,打印错误信息
    console.log(gl.getProgramInfoLog(program));
    gl.deleteProgram(program);
}

// 创建着色器的函数
function createShader(gl, type, source) {
    // 创建着色器
    var shader = gl.createShader(type);

    // 附加着色器源代码到着色器
    gl.shaderSource(shader, source);

    // 编译着色器
    gl.compileShader(shader);

    // 检查编译状态
    var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
    if (success) {
        return shader;
    }

    // 编译错误,打印错误信息
    console.log(gl.getShaderInfoLog(shader));
    gl.deleteShader(shader);
}

运行成功截图

跟随chatgpt学习如何使用GLSL进行简单的图形渲染,学习,图形渲染

跟随chatgpt学习如何使用GLSL进行简单的图形渲染,学习,图形渲染

他现在就是一个游来游去的红色三角形了。太神奇了!~文章来源地址https://www.toymoban.com/news/detail-802027.html

到了这里,关于跟随chatgpt学习如何使用GLSL进行简单的图形渲染的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用chatGPT进行论文润色(中英文均可)

    ChatGPT本质是一个基于GPT3.5,应用在对话场景的超大语言模型,在各种数据集上经过训练而来的,很好的掌握了语言的“本质”特征,自然可以进行语言相关的工作,论文润色只是小事情。 其实很简单,只需要按照下面的模板就可以润色啦: 模板:润色下面的一段话:“(你

    2024年02月11日
    浏览(40)
  • 如何简单的使用文心一言(高级版)(中国版ChatGPT)

    基于百度文心一言语言大模型的智能文本对话AI机器人API,支持聊天对话、行业咨询、语言学习、代码编写等功能. 重要提示:建议使用https协议,当https协议无法使用时再尝试使用http协议 请求方式: POST 序号 参数 是否必须 说明 1 ques 是 你的问题 2 appKey 是 唯一验证AppKey, 可前往官

    2024年01月19日
    浏览(46)
  • C# GUI编程入门指南:学习如何使用C#创建图形用户界面

    C# GUI编程入门指南:学习如何使用C#创建图形用户界面 在本文中,我们将介绍如何使用C#编写GUI程序。GUI(Graphical User Interface)是一种以图形方式呈现信息和操作功能的界面,它使得用户与计算机更加直观和友好。C#是一种强大的编程语言,它提供了丰富的库和工具来帮助我们

    2024年01月21日
    浏览(53)
  • 如何使用 ChatGPT/open ai 接口 进行图片生成(绘画、图片创作)

    最近gpt大火,它除了聊天,其实还具备了绘画功能,很多人不知道怎么用,下面文章介绍下。 在下面的案例中,输入“请帮我画一只可爱的动物”,返回的图片如下: 1、科学 shang wang 2、已经注册了GPT账号,并且能够正常使用。(这方面网上教程很多,这里就不重复了) 3、

    2024年02月11日
    浏览(43)
  • 【花雕学AI】如何避免ChatGPT封号,安全稳定地使用ChatGPT的技巧和简单过渡办法

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)

    2024年02月03日
    浏览(77)
  • chatgpt赋能python:使用Python来进行抢购,如何轻松秒杀商品

    在现代社会,大量的人们使用电商平台来完成他们的购物需求。然而,在疯狂的购物节日时,例如\\\"双11\\\",商品往往会被抢购一空。为此,许多人希望能够使用自动化脚本,在秒级别内完成商品的购买,以避免人工购物时的抢购高峰。 Python是一种优秀的编程语言,因为它可以

    2024年02月07日
    浏览(51)
  • Linux Docker图形化工具Portainer如何进行远程访问?

    Portainer 是一个轻量级的容器管理工具,可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可视化的界面,使得用户可以更加方便地管理 Docker 容器、镜像、网络和数据卷等资源。下面介绍如何将本地Portainer 管理界面结合cpolar内网穿透工具实现远程任意浏览器访问! 远程

    2024年02月05日
    浏览(85)
  • Linux Docker图形化工具Portainer如何进行远程访问

    Portainer 是一个轻量级的容器管理工具,可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可视化的界面,使得用户可以更加方便地管理 Docker 容器、镜像、网络和数据卷等资源。下面介绍如何将本地Portainer 管理界面结合cpolar内网穿透工具实现远程任意浏览器访问! 远程

    2024年02月08日
    浏览(48)
  • 如何使用Java进行机器学习?

    在Java中进行机器学习,可以使用各种开源机器学习库和框架来实现。以下是一些常用的Java机器学习库: Weka:Weka 是一个非常流行的机器学习库,提供了大量的算法和工具,以及用于数据预处理、特征选择和可视化的功能。 Deeplearning4j:Deeplearning4j 是一个用于深度学习的开源

    2024年02月10日
    浏览(44)
  • 【CHATGPT-3.5】如何使用ChatGPT的同时并学习记忆

    ChatGPT: ChatGPT可以为您提供答案和建议,但是它并不是一个完全替代您自己的大脑和记忆的工具。因此,以下是一些方法可以帮助您同时使用ChatGPT并进行学习和记忆: 将ChatGPT作为学习的一个补充:ChatGPT可以为您提供信息和建议,但是请记住它只是一个工具,不能完全替代您

    2023年04月22日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包