如何用颜色绘制gluQuadric?

问题描述

struct quadricObj {
    gluquadricObj* obj;
    GLenum drawmode{ glu_FILL };
    GLdouble radius{1.0};
    GLint slices{20};
    GLint stacks{20};
    glm::vec3 col{ 1.0,0.0,0.0 };
    std::vector<glm::mat4> M;
    glm::mat4 world_M() {
        glm::mat4 WM(1.0f);
        std::for_each(this->M.begin(),this->M.end(),[&WM](glm::mat4& m) { WM *= m; });
        //M0*M1*M2 TRS
        return WM;
    }
    GLvoid draw() {
        gluQuadricDrawStyle(this->obj,this->drawmode);
        gluniformMatrix4fv(worldLoc,1,GL_FALSE,glm::value_ptr(this->world_M()));
        glColor4f(this->col.r,this->col.g,this->col.b,1.0f); // doesn't work.
        gluSphere(this->obj,this->radius,this->slices,this->stacks);
    }
};

这是我使用quadricObj的结构。我认为glColor4f必须工作,但是不需要。 二次曲面保持黑色。 如何在GL中为二次曲面着色?

#version 330

in vec3 v_normal;
in vec2 v_texCoord;
in vec3 v_color;
in vec3 fragPos;

out vec4 gl_FragColor;

uniform vec3 lightColor;
uniform vec3 lightPos;
uniform vec3 viewPos;
uniform float ambientLight;
uniform int shine;

void main(void)
{   
    vec3 ambient = clamp(ambientLight*lightColor,1.0);

    vec3 normalVector = normalize(v_normal);
    vec3 lightDir = normalize(lightPos-fragPos);
    float diffuseLight = max(dot(normalVector,lightDir),0.0); 
    vec3 diffuse = clamp(diffuseLight * lightColor,1.0);

    vec3 viewDir = normalize(viewPos-fragPos);
    vec3 reflectDir = reflect(-lightDir,normalVector);
    float specularLight = max(dot(viewDir,reflectDir),0.0);
    specularLight = pow(specularLight,shine);
    vec3 specular = clamp(specularLight*lightColor,1.0);

    vec3 result = (ambient+diffuse)*v_color+specular*(0.8,0.8,0.8);

    gl_FragColor = vec4(result,1.0);
}

我编辑我的片段着色器包含phong模型。也可以与gluSphere一起使用吗?或不?我也在使用顶点着色器。具有in pos,col,nor,tex。和out

解决方法

gluSphere不能与用户定义的顶点着色器输入变量(属性)一起使用。您只能使用GLSL 1.20顶点着色器和Vertex Shader Built-In Attributes。您可以将GLSL 1.20顶点着色器与片段着色器结合使用。

合适的顶点着色器可能如下所示:

"env": {"PYTHONPATH": "${workspaceFolder}/path-to-package${env_var_list_separator}${env:PYTHONPATH}"}