Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl 细分顶点法向插值_Glsl - Fatal编程技术网

Glsl 细分顶点法向插值

Glsl 细分顶点法向插值,glsl,Glsl,我正在使用GLSL 4.0编写一个细分例程,该例程通过几何体着色器分割对象上的三角形。我没有使用重心坐标,而是使用向量算法来输出三角形顶点。我设法使细分工作正常,但我不知道如何插值顶点法线以生成正确的着色: #version 400 layout(triangles) in; layout(triangle_strip, max_vertices = 93) out; //MAX 128 uniform mat4 mvMatrix; uniform mat4 pMatrix; unifor

我正在使用GLSL 4.0编写一个细分例程,该例程通过几何体着色器分割对象上的三角形。我没有使用重心坐标,而是使用向量算法来输出三角形顶点。我设法使细分工作正常,但我不知道如何插值顶点法线以生成正确的着色:

#version 400 

layout(triangles) in;
layout(triangle_strip, max_vertices = 93) out; //MAX 128

uniform mat4 mvMatrix;
uniform mat4 pMatrix;
uniform mat3 normalMatrix; //mv matrix without translation
uniform int subdivision_level;
uniform vec4 lightPosition_camSpace; //light Position in camera space

uniform int time;

in data
{
  vec4 position_camSpace;
  vec3 normal_camSpace;
  vec2 textureCoordinate;
  vec4 color;
}vertexIn[3];

out fragmentData
{
  vec4 position_camSpace;
  vec3 normal_camSpace;
  vec2 textureCoordinate;
  vec4 color;
} frag;


void emit_triangle(vec4 position, vec4 width, vec4 hyp, float s) {

    /* NORMALS NOT FIXED */

    //A
    gl_Position = position;
    frag.color = vertexIn[0].color;
    frag.position_camSpace = vertexIn[0].position_camSpace;
    frag.normal_camSpace = vertexIn[0].normal_camSpace;
    frag.textureCoordinate = vertexIn[0].textureCoordinate;
    EmitVertex();

    //B
    gl_Position = position + width;
    frag.color = vertexIn[1].color;
    frag.position_camSpace = vertexIn[1].position_camSpace;
    frag.normal_camSpace = vertexIn[1].normal_camSpace;
    frag.textureCoordinate = vertexIn[1].textureCoordinate;

    EmitVertex();

    //C
    gl_Position = position + hyp;
    frag.color = vertexIn[2].color;
    frag.position_camSpace = vertexIn[2].position_camSpace;
    frag.normal_camSpace = vertexIn[2].normal_camSpace;
    frag.textureCoordinate = vertexIn[2].textureCoordinate;

    EmitVertex();

    EndPrimitive();
}

void main() {

  // A gl_In[0].gl_Position;
  // B gl_In[1].gl_Position;
  // C gl_In[2].gl_Position;

  float s = 1/pow(2,subdivision_level);
  int triangles_render = int(1/s);


  vec4 hyp_off = vec4(0.0,0.0,0.0,0.0);
  vec4 width_off = vec4(0.0,0.0,0.0,0.0);

  vec4 position = gl_in[0].gl_Position;
  vec4 width = s*(gl_in[1].gl_Position - gl_in[0].gl_Position);
  vec4 hyp = s*(gl_in[2].gl_Position - gl_in[0].gl_Position);

  vec4 hyp_off_f = vec4(0.0,0.0,0.0,0.0);
  vec4 width_off_f = width;


  for (int i=0; i<=subdivision_level+1; i++) {
    for (int j=0; j<triangles_render-i; j++) {

      // Normal triangle
      emit_triangle(position + hyp_off + width_off, width, hyp,s);
      width_off += width;  

      // Flipped triangle
      if (j <triangles_render-i-1)
      {
        emit_triangle(position + width_off_f + hyp_off_f, hyp, hyp - width,s);
        width_off_f += width;
      }

    }
    hyp_off += hyp;
    width_off = vec4(0.0,0.0,0.0,0.0);

    hyp_off_f += hyp;
    width_off_f = width;

  }
}
#版本400
平面布置图(三角形);
布局(三角形带,最大顶点=93)输出//最大128
一致mat4矩阵;
均匀mat4矩阵;
一致mat3正规矩阵//无平移的mv矩阵
统一的整数级;
均匀的vec4光位置空间//相机空间中的灯光位置
统一整数时间;
在数据中
{
vec4位置空间;
vec3正规空间;
vec2结构坐标;
vec4颜色;
}维替克星[3];
输出碎片数据
{
vec4位置空间;
vec3正规空间;
vec2结构坐标;
vec4颜色;
}弗拉格;
空心三角形(vec4位置、vec4宽度、vec4高度、浮点s){
/*法线不固定*/
//A
gl_位置=位置;
frag.color=vertexIn[0]。颜色;
frag.position\u camSpace=vertexIn[0]。position\u camSpace;
frag.normal\u camSpace=vertexIn[0]。normal\u camSpace;
frag.textureCoordinate=vertexIn[0]。textureCoordinate;
发射顶点();
//B
gl_位置=位置+宽度;
frag.color=vertexIn[1]。颜色;
frag.position\u camSpace=vertexIn[1]。position\u camSpace;
frag.normal\u camSpace=vertexIn[1]。normal\u camSpace;
frag.TextureCoordina=vertexIn[1]。TextureCoordina;
发射顶点();
//C
gl_位置=位置+高度;
frag.color=vertexIn[2]。颜色;
frag.position\u camSpace=vertexIn[2]。position\u camSpace;
frag.normal\u camSpace=vertexIn[2]。normal\u camSpace;
frag.TextureCoordina=vertexIn[2]。TextureCoordina;
发射顶点();
EndPrimitive();
}
void main(){
//[0]中的总账。总账位置;
//[1]中的B gl_.gl_位置;
//[2]中的C gl_.gl_位置;
浮子s=1/pow(2,分舱级);
int三角形_render=int(1/s);
vec4 hyp_off=vec4(0.0,0.0,0.0,0.0);
vec4宽度_off=vec4(0.0,0.0,0.0,0.0);
[0]中的vec4位置=gl_。gl_位置;
vec4宽度=s*(gl_位于[1]。gl_位置-gl_位于[0]。gl_位置);
vec4 hyp=s*(gl_位于[2]。gl_位置-gl_位于[0]。gl_位置);
vec4 hyp_off_f=vec4(0.0,0.0,0.0,0.0);
vec4宽度\u关闭\u f=宽度;
对于(int i=0;i