webgl-Webgl画6个颜色不同的面的正方体

问题描述

Webgl画6个颜色不同的面的正方体

学WebGL的时候照着书上打了一段代码,结果发现运行到网页上只有背景颜色,没有正方体,看控制台也没有错误信息输出,实在是不知道哪里错了...
js的代码
var VSHADER_SOURCE=
'attribute vec4 a_Position;n'+
'attribute vec4 a_Color;n'+
'uniform mat4 u_MvpMatrix;n'+
'varying vec4 v_Color;n'+
'void main(){n'+
' gl_Position=u_MvpMatrix*a_Position;n'+
' v_Color=a_Color;n'+
'}n';

var FSHADER_SOURCE=
'#ifdef GL_ESn'+
'precision mediump float;n'+
'#endifn'+
'varying vec4 v_Color;n'+
'void main(){n'+
' gl_FragColor=v_Color;n'+
'}n';

function main(){

var canvas =document.getElementById('webgl');
var gl=getWebGLContext(canvas);
if(!gl){
 console.log('Failed to get the rendering context for WebGL');
return;

}

// Initialize shaders
if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
console.log('Failed to intialize shaders.');
return;
}

// Set the vertex information
var n = initVertexBuffers(gl);
if (n < 0) {
console.log('Failed to set the vertex information');
return;
}
// Set the clear color and enable the depth test
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.enable(gl.DEPTH_TEST);

var u_MvpMatrix=gl.getUniformLocation(gl.program,'u_MvpMatrix');
if(!u_MvpMatrix){
console.log('fail to get the storage Location of u_MvpMatrix');
return ;
}

var mvpMatrix=new Matrix4();
mvpMatrix.setPerspective(30,1,1,100);//设置透明投影可视空间
mvpMatrix.lookAt(3,3,7,0,0,0,1,0);//创建视图矩阵
//传递数据
gl.uniformMatrix4fv(u_MvpMatrix,false,mvpMatrix.elements);

gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);

gl.drawElements(gl.TRIANGLES,n,gl.UNSIGNED_BYTE,0);
console.log(''+n);
}

function initVertexBuffers(gl) {
// Create a cube
// v6----- v5
// /| /|
// v1------v0|
// | | | |
// | |v7---|-|v4
// |/ |/
// v2------v3
//创建方式创建6个面,对每个面的顶点指定相同的颜色
var vertices = new Float32Array([ // Vertex coordinates
1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0,-1.0, 1.0, 1.0,-1.0, 1.0, // v0-v1-v2-v3 front
1.0, 1.0, 1.0, 1.0,-1.0, 1.0, 1.0,-1.0,-1.0, 1.0, 1.0,-1.0, // v0-v3-v4-v5 right
1.0, 1.0, 1.0, 1.0, 1.0,-1.0, -1.0, 1.0,-1.0, -1.0, 1.0, 1.0, // v0-v5-v6-v1 up
-1.0, 1.0, 1.0, -1.0, 1.0,-1.0, -1.0,-1.0,-1.0, -1.0,-1.0, 1.0, // v1-v6-v7-v2 left
-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,-1.0, 1.0, -1.0,-1.0, 1.0, // v7-v4-v3-v2 down
1.0,-1.0,-1.0, -1.0,-1.0,-1.0, -1.0, 1.0,-1.0, 1.0, 1.0,-1.0 // v4-v7-v6-v5 back
]);

var colors = new Float32Array([ // Colors
0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, // v0-v1-v2-v3 front(blue)
0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, // v0-v3-v4-v5 right(green)
1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, 1.0, 0.4, 0.4, // v0-v5-v6-v1 up(red)
1.0, 1.0, 0.4, 1.0, 1.0, 0.4, 1.0, 1.0, 0.4, 1.0, 1.0, 0.4, // v1-v6-v7-v2 left
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, // v7-v4-v3-v2 down
0.4, 1.0, 1.0, 0.4, 1.0, 1.0, 0.4, 1.0, 1.0, 0.4, 1.0, 1.0 // v4-v7-v6-v5 back
]);

//通过索引找到对应点位,这种方式好像只是为了减小画的点个数
var indices = new Uint8Array([ // Indices of the vertices
0, 1, 2, 0, 2, 3, // front
4, 5, 6, 4, 6, 7, // right
8, 9,10, 8,10,11, // up
12,13,14, 12,14,15, // left
16,17,18, 16,18,19, // down
20,21,22, 20,22,23 // back
]);

var indexBuffer=gl.createBuffer();
if(!indexBuffer)
return -1;

if(!initArrayBuffer(gl,vertices,3,gl.FLOAT,'a_Position'))
{
return -1;
}

if(!initArrayBuffer(gl,colors,3,gl.FLOAT,'a_Color')){
return -1;
}

//将索引写入缓冲区
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,indices,gl.STATIC_DRAW);

return indices.length;
}

//定义缓冲区对象的创建,绑定,数据写入,开启等操作
function initArrayBuffer(gl,data,num,type,attribute){
var buffer=gl.createBuffer();
if(!buffer){
console.log('fail to create a buffer');
return false;
}

gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
gl.bufferData(gl.ARRAY_BUFFER,data,gl.STATIC_DRAW);
// Assign the buffer object to the attribute variable

var a_attribute = gl.getAttribLocation(gl.program, attribute);
if (a_attribute < 0) {
console.log('Failed to get the storage location of ' + attribute);
return false;
}
gl.vertexAttribPointer(a_attribute, num, type, false, 0, 0);
// Enable the assignment of the buffer object to the attribute variable
gl.enableVertexAttribArray(a_attribute);

return true;
}

html的代码
<!DOCTYPE html>

Draw cube with specification of face color

Please use a browser that supports "canvas"

<script src="../lib/webgl-utils.js"></script>
<script src="../lib/webgl-debug.js"></script>
<script src="../lib/cuon-utils.js"></script>
<script src="../lib/cuon-matrix.js"></script>
<script src="ColoredCube.js"></script>

希望哪位前辈有时间的帮我看看哪里出错了...谢谢了

时间: 2024-10-27 15:55:40

webgl-Webgl画6个颜色不同的面的正方体的相关文章

如何将GUI画的网格线颜色变为透明,并且添加背景?

问题描述 这是我在网上找的最短路径的算法,我想将GUI画的网格线颜色变为透明,并且添加背景,请问该如何设置? 解决方案

HTML5 学习总结(四)——canvas绘图、WebGL、SVG

一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 SVG以及 VML 之间的一个重要的不同是,<canvas> 有一个基于 JavaScript 的绘图 API,而 SVG 和 VML 使用一个 XML 文档来描述绘图.SVG 绘图很容易编辑与生成,但功能明显要弱一些. canvas可以完成动画.游戏.图表.图像处理等原来需要Flash完成的一

Win32开发入门(23):渐变颜色填充

GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充.我们先来看看GradientFill函数到底长得什么样子,帅不帅. BOOL GradientFill( _In_ HDC hdc, _In_ PTRIVERTEX pVertex, _In_ ULONG nVertex, _In_ PVOID pMesh, _In_ ULONG nMesh, _In_ ULONG ulMode ); 参数涉及结构体,于是有些人就开始感到痛苦了,调用函数一遇到结构体就会痛苦,而这个

Word2010中如何自定义剪贴画的边框

  在Word2010文档中,用户可以为选中的剪贴画设置多种颜色.多种粗细尺寸的实线边框或虚线边框.实际上,当用户使用Word2010预设的剪贴画样式时,某些样式已经应用了剪贴画边框.当然,用户也可以根据实际需要自定义剪贴画边框. 操作步骤 1.打开Word2010文档窗口,在"插入"功能栏中找到剪贴画一栏.点击.导入需要使用的剪切画. 2.导入完毕后,编辑栏就出现了刚刚导入的图片. 3.在"图片工具"功能区的"格式"选项卡中,单击"图

MFC画刷类CBrush使用实例 .

画刷类CBrush利用画笔可以画图形的边框,而用画刷就可以在图形内着色.大多数的GDI绘图函数既使用画笔又使用画刷,它们用画笔绘制各种图形的周边,而用画刷填充图形,因而可以用一种颜色和风格去设置画笔,而用另一种颜色和风格去设定画刷,通过一次函数调用就可以绘制出形状复杂的图形.画刷是由CBrush类管理的,创建画刷有两种方法:一种是调用构造函数,另一种是调用相关的成员函数.1.CBrush的构造函数CBrush类的结构函数定义如下:① CBrush( );② CBrush( COLORREF cr

java 文本域 字符串 设置颜色

问题描述 java 文本域 字符串 设置颜色 java里面的JTextArea文本域里 设置某个字符串的颜色? 如何 解决方案 设置颜色多变的文本(转载)设置编辑框控件的背景.文本颜色 解决方案二: 你会更改java文本域的字体大小吗? 同样也可以同样的操作设置颜色 解决方案三: 用JEditorPane或者JTextPane

Bootstrap的Color Palette颜色选择器

Color Palette是一个颜色选择器,基于Bootstrap前端开发框架,适用于Bootstrap 2.3.2+以上的版本,依赖于jQuery插件库,支持自定义配置预设的颜色,轻量级的颜色选择jQuery插件. 依赖关系 Bootstrap 2.3.2+ jQuery 1.8.1+ 安装方法 如果你习惯使用Git,你可以使用下面的命令获取到插件的文件: git https://github.com/extremeFE/bootstrap-colorpalette.git 如果你不知道Git

微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例_javascript技巧

把录音的模块尝试过之后就想着微信小程序的视频播放会不会更有趣? 果然,微信小程序视频自带弹幕.是不是很爽,跟我一起来看看. 先上gif: 再上几张图: 1.视频播放器 2.选择弹幕颜色 3.弹幕来了... 1.视频播放器 微信已经封装的非常好.我这里只用了很简单的几个属性 由于以前没做过弹幕,看到danmu-list就激动了.而且只需要将弹幕内容加入集合即可. 弹幕列表的元素: { text: '第 1s 出现的红色弹幕',//文本 color: '#ff0000',//颜色 time: 1//

JavaScript游戏引擎列表

这里有一个网址收集了关于JS游戏引擎开发库的一个列表,转过来. 游戏引擎 Name Latest Release License Type Notes The Render Engine 1.5.3 MIT 跨浏览器; 大规模 API; 开源.2 gameQuery 0.5.1 CC BY-SA 2.5 和 jQuery 一起使用 gTile 0.0.1 Tile based Akihabara 1.3 GPL2/MIT Classic Repro 基于JS+HTML5的街机风格的游戏3 The