LWJGL 改变顶点之间线的颜色
LWJGL change line's color between vertices
我正在使用 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);
}
I'm using GL11.GL_TRIANGLES
cuz that's how I can make models' lines show up instead of faces.
嗯,GL_TRIANGLES
用于渲染 三角形 , 是 个面。如果您只想要模型的线条,您可以使用其中一种线条绘制模式(GL_LINES
、GL_LINE_LOOP
、GL_LINE_STRIP
等)。
不过,更好的方法是启用
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
,只显示三角形的轮廓。
您可以使用
再次关闭它
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
How could I make it so that it kind of combines those 2 colors depending on the distance of each vertex and the colors?
我不确定你的意思;默认情况下,从顶点着色器传递到片段着色器的值已经在网格中进行了插值;所以片段接收到的颜色已经取决于所有顶点的颜色和距离。
编辑:
在顶点着色器中:
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);
我正在使用 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);
}
I'm using
GL11.GL_TRIANGLES
cuz that's how I can make models' lines show up instead of faces.
嗯,GL_TRIANGLES
用于渲染 三角形 , 是 个面。如果您只想要模型的线条,您可以使用其中一种线条绘制模式(GL_LINES
、GL_LINE_LOOP
、GL_LINE_STRIP
等)。
不过,更好的方法是启用
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
,只显示三角形的轮廓。
您可以使用
再次关闭它glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
How could I make it so that it kind of combines those 2 colors depending on the distance of each vertex and the colors?
我不确定你的意思;默认情况下,从顶点着色器传递到片段着色器的值已经在网格中进行了插值;所以片段接收到的颜色已经取决于所有顶点的颜色和距离。
编辑:
在顶点着色器中:
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);