var points = [];
//由于shader只能传固定长度,所以这里的长度要写成定好的,并且不能长度不能为0;
//二三维一样的,改下类型就行了,一般只用判断是否在平面内
var shader = `bool pointInPolygon(vec3 p, vec3 points[${points.length}]){
bool inside = false;
const int length = ${points.length};
for (int i = 0; i < length; i++) {
float xi = points[i].x;
float yi = points[i].y;
float xj;
float yj;
if (i == 0) {
xj = points[length - 1].x;
yj = points[length - 1].y;
} else {
xj = points[i - 1].x;
yj = points[i - 1].y;
}
bool intersect = ((yi > p.y) != (yj > p.y)) && (p.x < (xj - xi) * (p.y - yi) / (yj - yi) + xi);
if (intersect) {
inside = !inside;
}
}
return inside;
}`
————————————————
版权声明:本文为CSDN博主「kingslayerzxs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40043761/article/details/117700084
二、测试示例
1.顶点着色器
precision highp float;
attribute vec3 position;
attribute vec3 normal;
uniform mat3 normalMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
varying vec3 fNormal;
varying vec3 fPosition;
void main()
{
fNormal = normalize(normalMatrix * normal);
vec4 pos = modelViewMatrix * vec4(position, 1.0);
fPosition = pos.xyz;
gl_Position = projectionMatrix * pos;
}
2.片元着色器
precision highp float;
uniform float time;
uniform vec2 resolution;
varying vec3 fPosition;
varying vec3 fNormal;
bool pointInPolygon(vec3 p, vec3 points[3]){
bool inside = false;
const int length = 3;
for (int i = 0; i < length; i++) {
float xi = points[i].x;
float yi = points[i].y;
float xj;
float yj;
if (i == 0) {
xj = points[length - 1].x;
yj = points[length - 1].y;
} else {
xj = points[i - 1].x;
yj = points[i - 1].y;
}
bool intersect = ((yi > p.y) != (yj > p.y)) && (p.x < (xj - xi) * (p.y - yi) / (yj - yi) + xi);
if (intersect) {
inside = !inside;
}
}
return inside;
}
void main(){
// float coeff[3]=float[3](1.11,52.0,52.1);
vec3 vec3Array[3];
vec3Array[0] = vec3(1.0, 0.0, 0.0);
vec3Array[1] = vec3(0.0, 1.0, 0.0);
vec3Array[2] = vec3(1.0, 1.0, 0.0);
vec3 point=vec3(gl_FragCoord.x/resolution.x,gl_FragCoord.y/resolution.y,0.0);
bool isInside=pointInPolygon(point,vec3Array);
if(isInside){
gl_FragColor = vec4(fNormal, 1.0);
}else{
gl_FragColor = vec4(1.0,1.0,1.0, 0.2);
}
}
结果:
image.png
网友评论