Webgl-超级基础随笔1-shader初始化与三角绘制

目录

shader的创建与绑定

静态三角形绘制

旋转三角绘制


shader的创建与绑定

  1. demo.html

<!doctype html>

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8">

</head>

<body>

<canvas id="myCanvas" width="400" height="400"></canvas>

<!-- 矩阵变换用 -->

<script type="text/javascript" src="./matrix.js"></script>

<script type="text/javascript" src="./demo.js"></script>

</body>

</html>

  1. demo.js

var canvas = document.getElementById('myCanvas')//获取canvas

var gl = canvas.getContext('webgl')//获取上下文

 

var VSHADER_SOURCE,FSHADER_SOURCE//定义顶点、片元源代码

var program = gl.createProgram()//创建webgl程序

var vertexShader, fragmentShader

//创建着色器(gl上下文、着色器源码,着色器类型)

function createShader(gl, sourceCode, type) {

// create shader

var shader = gl.createShader(type)

gl.shaderSource(shader, sourceCode)//挂载代码

gl.compileShader(shader)//编译

//打印shader中的编译错误信息

var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);

if (!compiled) {

var error = gl.getShaderInfoLog(shader);

console.log('Failed to compile shader : ' + error);

gl.deleteShader(shader);

return null;

}

 

return shader

}

//定义顶点着色器vertex shader

vertexShader = createShader(gl,VSHADER_SOURCE,gl.VERTEX_SHADER)

//定义片元着色器frament shader

fragmentShader = createShader(gl,FSHADER_SOURCE,gl.FRAGMENT_SHADER)

//program中添加shader

gl.attachShader(program, vertexShader)

gl.attachShader(program,fragmentShader)

//连接program to context

gl.linkProgram(program)

gl.useProgram(program)

gl.program = program


静态三角形绘制

  1. demo.js

var VSHADER_SOURCE,FSHADER_SOURCE//定义顶点、片元源代码

 

VSHADER_SOURCE =

'attribute vec4 a_Position;\n'+

'void main (){\n'+

'gl_Position = a_Position;\n'+

'}\n'

FSHADER_SOURCE =

'void main (){\n'+

'gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n'+

'}\n'

function initVertexBuffers (gl) {

var vertices = new Float32Array([

0, 0.5, -0.5, -0.5, 0.5, -0.5

])

var n = 3//取3个点

var vertexBuffer = gl.createBuffer()

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)

// write data into the buffer object

gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)

// get attribute a_Position address in vertex shader

var a_Position = gl.getAttribLocation(gl.program, 'a_Position')

gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)//每2个data为一点

// enable a_Position variable

gl.enableVertexAttribArray(a_Position)

return n

}

// write the positions of vertices to a vertex shader

var n = initVertexBuffers(gl)

 

//绘制

gl.clearColor(0, 0, 0, 1)//背景色

function draw() {

//cleaer canvas and add background color

gl.clear(gl.COLOR_BUFFER_BIT)//背景色

gl.drawArrays(gl.TRIANGLES, 0, n)

}

draw()


旋转三角绘制

  1. demo.js:关键代码

顶点着色器源码

VSHADER_SOURCE =

'attribute vec4 a_Position;\n'+

'uniform mat4 u_ModelMatrix;\n' +//旋转

'void main (){\n'+

'gl_Position = u_ModelMatrix*a_Position;\n'+//位置*旋转角度

'}\n'

角度定义与变换

//旋转角度定义

var currentAngle = 0

var g_last = Date.now()

var u_ModelMatrix = gl.getUniformLocation(gl.program, 'u_ModelMatrix')

var modelMatrix = new Matrix4()

在draw中设置旋转轴

//设置旋转轴与角度,关联gl

modelMatrix.setRotate(currentAngle, 0, 1, 0)//angle,x,y,z

gl.uniformMatrix4fv(u_ModelMatrix, false, modelMatrix.elements)

动画

function animate () {

var now = Date.now()

var duration = now - g_last

g_last = now

currentAngle = currentAngle + duration / 1000 * 180

}

效果汇总

var tick = function () {//效果汇总

// update the new rotation angle

animate()

// draw

draw()

requestAnimationFrame(tick)//H5API

}

tick()


矩阵基础部分明天有空再练笔咯。 (源码:https://github.com/11zouzouzou/Webgl-basic

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值