【问题标题】:LWJGL change line's color between verticesLWJGL 改变顶点之间线条的颜色
【发布时间】:2015-07-01 15:25:38
【问题描述】:

我正在使用 java 和 LWJGL/openGL 创建一些图形。对于渲染,我使用以下内容:

RawModel 的构造函数:

public RawModel(int vaoID, int vertexCount, String name){
    this.vaoID = vaoID;
    this.vertexCount = vertexCount;
    this.name = name;
}

渲染器:

public void render(Entity entity, StaticShader shader){
        RawModel rawModel = entity.getRaw(active);
        GL30.glBindVertexArray(rawModel.getVaoID());
        GL20.glEnableVertexAttribArray(0);
        GL20.glEnableVertexAttribArray(1);
        GL20.glEnableVertexAttribArray(3);
        Matrix4f transformationMatrix = Maths.createTransformationMatrix(entity.getPosition(),
            entity.getRotX(), entity.getRotY(), entity.getRotZ(), entity.getScale());
        shader.loadTransformationMatrix(transformationMatrix);
        GL11.glDrawElements(GL11.GL_TRIANGLES, rawModel.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
        GL20.glDisableVertexAttribArray(0);
        GL20.glDisableVertexAttribArray(1);
        GL20.glDisableVertexAttribArray(3);
        GL30.glBindVertexArray(0);
}

我正在使用 GL11.GL_TRIANGLES 因为这就是我可以显示模型的线条而不是面孔的方法。但是当我为顶点设置颜色时,它只是将周围的线条着色为颜色集,在某些情况下,所有线条都采用周围顶点的颜色。我怎样才能使它根据每个顶点的距离和颜色结合这两种颜色?

片段着色器:

#version 400 core

in vec3 colour;
in vec2 pass_textureCoords;

out vec4 out_Color;

uniform sampler2D textureSampler;

void main(void){

    vec4 textureColour = texture(textureSampler, pass_textureCoords);

    //out_Color = texture(textureSampler, pass_textureCoords);
    out_Color = vec4(colour, 1.0);

}

顶点着色器:

#version 400 core

in vec3 position;
in vec2 textureCoords;
in int selected;

out vec3 colour;
out vec2 pass_textureCoords;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;

void main(void){

    gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(position, 1.0);
    pass_textureCoords = textureCoords;
    if(selected == 1){
        colour = vec3(200, 200, 200);
    }
    else{
        colour = vec3(0, 0, 0);
    }
    gl_BackColor = vec4(colour, 1.0);
}

【问题讨论】:

    标签: java opengl 3d rendering lwjgl


    【解决方案1】:

    我正在使用GL11.GL_TRIANGLES,因为这就是我可以让模特的线条而不是面孔出现的方法。

    嗯,GL_TRIANGLES 用于渲染三角形,它们面。如果您只想要模型的线条,您可以使用其中一种线条绘制模式(GL_LINESGL_LINE_LOOPGL_LINE_STRIP 等)。

    但是,更好的方法是启用

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    

    ,只显示三角形的轮廓。

    你可以再次关闭它

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    

    我怎样才能让它根据每个顶点的距离和颜色组合这两种颜色?

    我不确定你的意思;默认情况下,从顶点着色器传递到片段着色器的值已经在网格中插值;所以片段接收的颜色已经取决于所有顶点的颜色和距离。


    编辑:

    在顶点着色器中:

    if(selected == 1){
        colour = vec3(200, 200, 200);
    }
    

    我假设您要指定一个 RGB 值 (200, 200, 200),这是一种非常浅的白色。但是,OpenGL 使用 0.0 到 1.0 范围内的浮点颜色分量。高于或低于此范围的值将被剪裁。 colour 的值现在被插值到片段中,它将接收组件远高于 1.0 的值。这些将被剪裁为 1.0,这意味着您的所有片段都显示为白色。

    所以,为了解决这个问题,你必须改用类似的东西

    colour = vec3(0.8, 0.8, 0.8);
    

    【讨论】:

    • 是的,实际上我就是这样做的。只显示三角形的轮廓..我正在使用 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);但线条在每个像素上具有相同的颜色。我不知道为什么,但在这种情况下,我的颜色没有插值?
    • 好吧,我还添加了一张图片,这样你就可以看到它的样子:) 在那个例子中,由于插值,白线应该有不同的灰色,对吧?至少这就是我想要实现的目标。
    • 天哪!太感谢了!
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多