Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
42253300
T
three.js
项目概览
Ablesons
/
three.js
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
three.js
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
42253300
编写于
12月 13, 2010
作者:
M
Mr.doob
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
WebGLRenderer2:
Added textures
上级
8d2096c7
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
152 addition
and
20 deletion
+152
-20
examples/webglrenderer2_sandbox.html
examples/webglrenderer2_sandbox.html
+46
-10
src/renderers/WebGLRenderer2.js
src/renderers/WebGLRenderer2.js
+106
-10
未找到文件。
examples/webglrenderer2_sandbox.html
浏览文件 @
42253300
...
...
@@ -137,20 +137,28 @@
var
vertex_shader
=
ShaderUtils
.
lib
[
'
basic
'
].
vertex_shader
;
var
fragment_shader
=
ShaderUtils
.
lib
[
'
basic
'
].
fragment_shader
;
/*
var material = new THREE.MeshShaderMaterial( {
uniforms: uniforms,
vertex_shader: vertex_shader,
fragment_shader: fragment_shader
} );
*/
var
generatedTexture
=
new
THREE
.
Texture
(
generateTexture
()
);
// var material = new THREE.MeshBasicMaterial( { color: 0x0000ff, opacity: 0.5 } );
var
material
=
new
THREE
.
MeshNormalMaterial
();
var
materials
=
[
new
THREE
.
MeshLambertMaterial
(
{
color
:
0xdddddd
,
shading
:
THREE
.
FlatShading
}
),
new
THREE
.
MeshPhongMaterial
(
{
ambient
:
0x030303
,
color
:
0xdddddd
,
specular
:
0x009900
,
shininess
:
30
,
shading
:
THREE
.
FlatShading
}
),
new
THREE
.
MeshNormalMaterial
(),
new
THREE
.
MeshBasicMaterial
(
{
color
:
0x665500
,
blending
:
THREE
.
AdditiveBlending
}
),
new
THREE
.
MeshLambertMaterial
(
{
color
:
0xdddddd
,
shading
:
THREE
.
SmoothShading
}
),
new
THREE
.
MeshPhongMaterial
(
{
ambient
:
0x030303
,
color
:
0xdddddd
,
specular
:
0x009900
,
shininess
:
30
,
shading
:
THREE
.
SmoothShading
}
),
new
THREE
.
MeshNormalMaterial
(
{
shading
:
THREE
.
SmoothShading
}
),
new
THREE
.
MeshBasicMaterial
(
{
color
:
0xffaa00
,
wireframe
:
true
}
),
new
THREE
.
MeshDepthMaterial
(
{
near
:
1
,
far
:
2000
}
),
new
THREE
.
MeshBasicMaterial
(
{
map
:
generatedTexture
}
),
new
THREE
.
MeshLambertMaterial
(
{
map
:
generatedTexture
}
),
new
THREE
.
MeshShaderMaterial
(
{
uniforms
:
uniforms
,
vertex_shader
:
vertex_shader
,
fragment_shader
:
fragment_shader
}
)
];
for
(
var
i
=
0
;
i
<
1000
;
i
++
)
{
var
mesh
=
new
THREE
.
Mesh
(
geometry
,
material
);
var
mesh
=
new
THREE
.
Mesh
(
geometry
,
material
s
[
Math
.
floor
(
Math
.
random
()
*
materials
.
length
)
]
);
mesh
.
position
.
x
=
Math
.
random
()
*
10000
-
5000
;
mesh
.
position
.
y
=
Math
.
random
()
*
10000
-
5000
;
mesh
.
position
.
z
=
Math
.
random
()
*
10000
-
5000
;
...
...
@@ -175,6 +183,34 @@
}
function
generateTexture
()
{
var
canvas
=
document
.
createElement
(
'
canvas
'
);
canvas
.
loaded
=
true
;
canvas
.
width
=
256
;
canvas
.
height
=
256
;
var
context
=
canvas
.
getContext
(
'
2d
'
);
var
image
=
context
.
getImageData
(
0
,
0
,
256
,
256
);
var
x
=
0
,
y
=
0
;
for
(
var
i
=
0
,
j
=
0
,
l
=
image
.
data
.
length
;
i
<
l
;
i
+=
4
,
j
++
)
{
x
=
j
%
256
;
y
=
x
==
0
?
y
+
1
:
y
;
image
.
data
[
i
+
2
]
=
Math
.
floor
(
x
^
y
);
image
.
data
[
i
+
3
]
=
255
;
}
context
.
putImageData
(
image
,
0
,
0
);
return
canvas
;
}
function
onDocumentMouseMove
(
event
)
{
mouseX
=
(
event
.
clientX
-
windowHalfX
)
*
10
;
...
...
src/renderers/WebGLRenderer2.js
浏览文件 @
42253300
...
...
@@ -2,7 +2,7 @@
* @author mrdoob / http://mrdoob.com/
*/
THREE
.
WebGLRenderer2
=
function
(
scene
)
{
THREE
.
WebGLRenderer2
=
function
()
{
var
_canvas
=
document
.
createElement
(
'
canvas
'
),
_gl
,
_currentProgram
,
...
...
@@ -136,6 +136,13 @@ THREE.WebGLRenderer2 = function ( scene ) {
_gl
.
uniform3f
(
program
.
uniforms
.
mColor
,
material
.
color
.
r
,
material
.
color
.
g
,
material
.
color
.
b
);
_gl
.
uniform1f
(
program
.
uniforms
.
mOpacity
,
material
.
opacity
);
if
(
material
.
map
)
{
setTexture
(
material
.
map
,
0
);
_gl
.
uniform1i
(
program
.
uniforms
.
tMap
,
0
);
}
}
else
if
(
material
instanceof
THREE
.
MeshNormalMaterial
)
{
_gl
.
uniform1f
(
program
.
uniforms
.
mOpacity
,
material
.
opacity
);
...
...
@@ -161,6 +168,23 @@ THREE.WebGLRenderer2 = function ( scene ) {
}
if
(
attributes
.
uv
>=
0
)
{
if
(
geometry
.
__webglBuffers
.
uvBuffer
)
{
_gl
.
bindBuffer
(
_gl
.
ARRAY_BUFFER
,
geometry
.
__webglBuffers
.
uvBuffer
);
_gl
.
enableVertexAttribArray
(
attributes
.
uv
);
_gl
.
vertexAttribPointer
(
attributes
.
uv
,
2
,
_gl
.
FLOAT
,
false
,
0
,
0
);
}
else
{
_gl
.
disableVertexAttribArray
(
attributes
.
uv
);
}
}
if
(
!
material
.
wireframe
)
{
_gl
.
bindBuffer
(
_gl
.
ELEMENT_ARRAY_BUFFER
,
geometry
.
__webglBuffers
.
faceBuffer
);
...
...
@@ -180,6 +204,8 @@ THREE.WebGLRenderer2 = function ( scene ) {
}
// Buffers
function
buildBuffers
(
geometry
)
{
var
f
,
fl
,
face
,
v1
,
v2
,
v3
,
vertexNormals
,
normal
,
uv
,
...
...
@@ -190,6 +216,7 @@ THREE.WebGLRenderer2 = function ( scene ) {
for
(
f
=
0
,
fl
=
geometry
.
faces
.
length
;
f
<
fl
;
f
++
)
{
face
=
geometry
.
faces
[
f
];
uv
=
geometry
.
uvs
[
f
];
vertexNormals
=
face
.
vertexNormals
;
faceNormal
=
face
.
normal
;
...
...
@@ -253,7 +280,7 @@ THREE.WebGLRenderer2 = function ( scene ) {
verticesArray
.
push
(
v3
.
x
,
v3
.
y
,
v3
.
z
);
verticesArray
.
push
(
v4
.
x
,
v4
.
y
,
v4
.
z
);
if
(
vertexNormals
.
length
==
4
&&
needsSmoothNormals
)
{
if
(
vertexNormals
.
length
==
4
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
...
...
@@ -333,6 +360,8 @@ THREE.WebGLRenderer2 = function ( scene ) {
}
// Shaders
function
createProgram
(
material
)
{
var
pvs
=
''
,
vs
=
''
,
pfs
=
''
,
fs
=
''
,
...
...
@@ -349,7 +378,21 @@ THREE.WebGLRenderer2 = function ( scene ) {
pfs
+=
'
uniform vec3 mColor;
\n
'
;
pfs
+=
'
uniform float mOpacity;
\n
'
;
fs
+=
'
gl_FragColor = vec4( mColor.xyz * mOpacity, mOpacity );
\n
'
;
fs
+=
'
gl_FragColor = vec4( mColor.xyz, mOpacity );
\n
'
;
if
(
material
.
map
)
{
pvs
+=
'
varying vec2 vUv;
\n
'
,
vs
+=
'
vUv = uv;
\n
'
,
pfs
+=
'
uniform sampler2D tMap;
\n
'
;
pfs
+=
'
varying vec2 vUv;
\n
'
;
fs
+=
'
gl_FragColor *= texture2D( tMap, vUv );
\n
'
;
identifiers
.
push
(
'
tMap
'
);
}
identifiers
.
push
(
'
mColor
'
);
identifiers
.
push
(
'
mOpacity
'
);
...
...
@@ -363,13 +406,13 @@ THREE.WebGLRenderer2 = function ( scene ) {
vs
+=
'
void main() {
\n
'
;
fs
+=
'
void main() {
\n
'
;
pvs
+=
"
varying vec3 vNormal;
\n
"
;
pvs
+=
'
varying vec3 vNormal;
\n
'
;
vs
+=
'
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
\n
'
;
vs
+=
"
vNormal = normalize( normalMatrix * normal );
\n
"
;
vs
+=
'
vNormal = normalize( normalMatrix * normal );
\n
'
;
pfs
+=
'
uniform float mOpacity;
\n
'
;
pfs
+=
"
varying vec3 vNormal;
\n
"
;
fs
+=
"
gl_FragColor = vec4( ( normalize( vNormal ) + 1.0 ) * 0.5, mOpacity );
\n
"
;
pfs
+=
'
varying vec3 vNormal;
\n
'
;
fs
+=
'
gl_FragColor = vec4( ( normalize( vNormal ) + 1.0 ) * 0.5, mOpacity );
\n
'
;
identifiers
.
push
(
'
mOpacity
'
);
...
...
@@ -397,7 +440,7 @@ THREE.WebGLRenderer2 = function ( scene ) {
material
.
__webglProgram
=
compileProgram
(
pvs
+
vs
,
pfs
+
fs
);
cacheUniformLocations
(
material
.
__webglProgram
,
identifiers
);
cacheAttributeLocations
(
material
.
__webglProgram
,
[
"
position
"
,
"
normal
"
,
"
uv
"
,
"
tangent
"
]
);
cacheAttributeLocations
(
material
.
__webglProgram
,
[
"
position
"
,
"
normal
"
,
"
uv
"
/*, "tangent"*/
]
);
return
true
;
...
...
@@ -408,7 +451,7 @@ THREE.WebGLRenderer2 = function ( scene ) {
var
program
=
_gl
.
createProgram
(),
shader
prefix_vertex
=
[
//
maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
maxVertexTextures
()
>
0
?
"
#define VERTEX_TEXTURES
"
:
""
,
"
uniform mat4 objectMatrix;
"
,
"
uniform mat4 modelViewMatrix;
"
,
...
...
@@ -466,7 +509,7 @@ THREE.WebGLRenderer2 = function ( scene ) {
"
VALIDATE_STATUS:
"
+
_gl
.
getProgramParameter
(
program
,
_gl
.
VALIDATE_STATUS
)
+
"
\n
"
+
"
ERROR:
"
+
_gl
.
getError
()
+
"
\n\n
"
+
"
Vertex Shader:
\n
"
+
prefix_vertex
+
vertex_shader
+
"
\n\n
"
+
"
Fragment Shader:
\n
"
+
prefix_fragment
+
fragment_shader
);
"
Fragment Shader:
\n
"
+
prefix_fragment
+
fragment_shader
);
}
...
...
@@ -509,6 +552,59 @@ THREE.WebGLRenderer2 = function ( scene ) {
}
// Textures
function
setTexture
(
texture
,
slot
)
{
if
(
!
texture
.
__webglTexture
&&
texture
.
image
.
loaded
)
{
texture
.
__webglTexture
=
_gl
.
createTexture
();
_gl
.
bindTexture
(
_gl
.
TEXTURE_2D
,
texture
.
__webglTexture
);
_gl
.
texImage2D
(
_gl
.
TEXTURE_2D
,
0
,
_gl
.
RGBA
,
_gl
.
RGBA
,
_gl
.
UNSIGNED_BYTE
,
texture
.
image
);
_gl
.
texParameteri
(
_gl
.
TEXTURE_2D
,
_gl
.
TEXTURE_WRAP_S
,
paramThreeToGL
(
texture
.
wrap_s
)
);
_gl
.
texParameteri
(
_gl
.
TEXTURE_2D
,
_gl
.
TEXTURE_WRAP_T
,
paramThreeToGL
(
texture
.
wrap_t
)
);
_gl
.
texParameteri
(
_gl
.
TEXTURE_2D
,
_gl
.
TEXTURE_MAG_FILTER
,
paramThreeToGL
(
texture
.
mag_filter
)
);
_gl
.
texParameteri
(
_gl
.
TEXTURE_2D
,
_gl
.
TEXTURE_MIN_FILTER
,
paramThreeToGL
(
texture
.
min_filter
)
);
_gl
.
generateMipmap
(
_gl
.
TEXTURE_2D
);
_gl
.
bindTexture
(
_gl
.
TEXTURE_2D
,
null
);
}
_gl
.
activeTexture
(
_gl
.
TEXTURE0
+
slot
);
_gl
.
bindTexture
(
_gl
.
TEXTURE_2D
,
texture
.
__webglTexture
);
}
function
maxVertexTextures
()
{
return
_gl
.
getParameter
(
_gl
.
MAX_VERTEX_TEXTURE_IMAGE_UNITS
);
};
function
paramThreeToGL
(
p
)
{
switch
(
p
)
{
case
THREE
.
RepeatWrapping
:
return
_gl
.
REPEAT
;
break
;
case
THREE
.
ClampToEdgeWrapping
:
return
_gl
.
CLAMP_TO_EDGE
;
break
;
case
THREE
.
MirroredRepeatWrapping
:
return
_gl
.
MIRRORED_REPEAT
;
break
;
case
THREE
.
NearestFilter
:
return
_gl
.
NEAREST
;
break
;
case
THREE
.
NearestMipMapNearestFilter
:
return
_gl
.
NEAREST_MIPMAP_NEAREST
;
break
;
case
THREE
.
NearestMipMapLinearFilter
:
return
_gl
.
NEAREST_MIPMAP_LINEAR
;
break
;
case
THREE
.
LinearFilter
:
return
_gl
.
LINEAR
;
break
;
case
THREE
.
LinearMipMapNearestFilter
:
return
_gl
.
LINEAR_MIPMAP_NEAREST
;
break
;
case
THREE
.
LinearMipMapLinearFilter
:
return
_gl
.
LINEAR_MIPMAP_LINEAR
;
break
;
}
return
0
;
}
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录