片元着色器精度声明不可或缺

function main(){
    var canvas = document.getElementById("webgl");
    var gl = getWebGLContext(canvas);
    var VSHADER_SOURCE = function(){
        /*
         attribute vec4 a_Position;
         attribute float a_PointSize;
         void main(){
         gl_Position = a_Position;
         gl_PointSize = a_PointSize;
         }
         */
    }.toString().match(/\/\*([^]*)\*\//)[1];

    var FSHADER_SOURCE = function(){
        /*
      precision lowp float;
         uniform vec4 u_FragColor;
         void main(){
         gl_FragColor = u_FragColor;
         }
         */
    }.toString().match(/\/\*([^]*)\*\//)[1];

    initShaders(gl,VSHADER_SOURCE,FSHADER_SOURCE);
    var a_Position = gl.getAttribLocation(gl.program,"a_Position");
    var a_PointSize = gl.getAttribLocation(gl.program,"a_PointSize");
    var u_FragColor = gl.getUniformLocation(gl.program,"u_FragColor");
    gl.clearColor(0.0,0.0,0.0,0.8);
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.uniform4f(u_FragColor, 0.1,1.0,1.0,1.0);
    for (var i=0;i<10;i++){
        gl.vertexAttrib3f(a_Position,(i+1)*0.1,(i+1)*0.1,0.0);
        gl.vertexAttrib1f(a_PointSize, 10.0);
        gl.drawArrays(gl.POINTS, 0, 1);
    }
}

如果:

Failed to compile shader: ERROR: 0:3: ‘‘ : No precision specified for (float)

解决办法:

在片元着色器里面加上浮点数精度声明(事实上,片元着色器支持所有3种精度,并不是精度不支持,只是需要声明而已)

时间: 2024-10-12 13:53:45

片元着色器精度声明不可或缺的相关文章

WebGL 着色器语言(GLSL ES)

1.类型转换内置函数 转换/函数/描述 转换为整形数/int(float)/将浮点数的小数部分删去,转换为整形数(比如,将3.14转换为3) 转换为整形数/intl(bool)/true被转换为1,false被转换为0 转换为浮点数/float(int)/将整形数转换为浮点数(比如,将8转换为8.0) 转换为浮点数/float(bool)/true被转换为1.0,false被转换为0.0 转换为布尔值/bool(int)/0被转换为false,其他非0倍转换为true 转换为布尔值/0.0被转换

OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)

OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章) 4.5精度和精度修饰符 4.5.1范围和精度 用于存储和展示浮点数.整数变量的范围和精度依赖于数值的源(varying,uniform,纹理查找,等等),是不是顶点或者片元着色器,还有其他一些底层实现的细节.最低存储需要通过精度修饰符来声明.典型地,精度操作必须要保留变量包含的精度存储.仅有的例外是需要大量复杂计算的内建函数,如atan(),返回值的精度低于声明的精度. 强烈建议顶点语言提供一种匹配IEEE单精度浮点数或更高精

OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-while) 跳跃(discard, return, break, continue) 6.1函数定义   着色器是由一系列全局声明和函数定义组成的.函数声明规范如下: // prototype returnType functionName (type0 arg0, type1 arg1, ...,

OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围

OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)   所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情况下,变量在声明的时候可以使用等号“=”进行初始化. 用户定义类型可以使用struct,在结构体中所有变量类型都必须是OpenGL ES着色器语言定义的关键字.OpenGL ES着色语言是类型安全的,因此不支持隐式类型转换.

OpenGL ES着色器语言----------------储存修饰符

一.存储修饰符 本地变量只能使用存储修饰符const. 函数参数只能用const.函数返回值类型和结构体字段不要使用const. 从一个运行时着色器到下一个运行时着色器之间进行数据类型通信是不存在的.这阻止了同一个着色器在多个顶点和片元之间同时执行. 没有存储修饰符或仅仅使用const修饰符的全局变量,可能在main()执行前进行初始化.Uniforms, attributes和varyings可能没有初始化器. 1.默认存储修饰符 如果在全局变量前没有修饰符,那么它们就与应用程序和其他处理器上

OpenGL学习日记-2015.3.5——Hello glsl(着色器)

过年前忍不住买了本新版的OpenGL编程指南,主要的目的还是为了系统的学习着色器编程,另外就是接触新版的OpenGL技术和思想.看了几页,就过年了QAQ.回来后也是各种不在状态,不想上班,不想工作,不想写代码...昨天终于强迫自己继续看书,也找回了些状态. 书本基础知识的全面性和权威性就不用说了,不过这个源代码就....这第一个例子照着代码来抄结果...我想应该是原来的代码一个参数错了,折腾了半天,代码分析是详说.主要是分析代码,有什么说什么,并没有全面的说明着色器的基本内容,想着在着色器的基础

OpenGLES2.0着色器语言glsl

OpenGLES2.0中是强制使用可编程的渲染管线的,使用的是glsl着色器语言,因为着色器语言是使用的GPU,即图形处理单元,而不是CPU,这样可以使CPU从繁重的几何计算和像素的处理中解脱出来了.这就加大了处理的速度. 下面的这篇教程是转载的.原文地址如下,感谢作者manyou http://www.apkbus.com/blog-99192-39382.html 一.着色语言基础 数据类型概述 1. 标量 标量也被称为"无向量"其值只有大小,并不具有方向.标量之间的运算遵循简单的

着色器(Shader)

着色器(Shader) 顶点着色器(Vertex shader) 片段着色器(Fragment shader) 几何着色器(Geometry Shader) 提供通用计算能力的着色器(Compute Shader) 顶点着色器(Vertex Shader) 每个顶点都要执行一次Vertex Shader. 它的功能就是把每个顶点在虚拟空间中的三维坐标变换为可以在 屏幕上显示的二维坐标,并带有用于z-buffer的深度信息.可操作属性:位置.颜色.纹理坐标,但是不能创建新的顶点. 主要完成以下工作

WebGL中的OpenGL着色器语言

在webgl中,调用了OpenGL-ES-2.0的API,而在OpenGL-ES专为嵌入式设备设计,其和其它设备一样,都是使用GLSL(GL Shading Language)来编写片段程序并执行于GPU的着色器上,来完成对对象的渲染.GLSL在其中起着相当重要的作用,所以要玩好webgl,我们就得把GLSL搞懂,本文主要介绍shader的基础使用及组成. 整个管线处理过程: 1.指定几何对象 1.顶点数组(直接将顶点数据传送至shader里) 2.顶点索引(将顶点数据保存于缓冲区中,用索引来从