应该是这样的:
glOrtho(-1, 1, 1, -1, -1, 1);
而不是这个:
glOrtho(0,1000,600,0,-1,1)
我的屏幕宽度是1000,高度是600。
我正在使用OpenGL(lwjgl)在java中制作2d游戏。我可以画一个三角形,但使用我的着色器时它不起作用。着色器编译没有错误,但屏幕变黑了。
我完全不知道该怎么做,我必须启用什么吗?
这是我在GLSL中的vertexShader代码
#version 430
layout (location = 0) in vec2 position;
void main()
{
color = vec4(1, 0, 0, 1);
gl_Position = vec4(position, -1, 1);
}
这是片段着色器:
#version 430
void main()
{
gl_FragColor = vec4(1, 1, 1, 1);
}
我最近发现,如果我只运行它有效的片段着色器,我就会得到指定的颜色。但是如果我也运行顶点着色器,它就会变成黑色,所以问题出在顶点着色器上。
着色器类:
'导入静态org.lwjgl.opengl.GL20.;导入静态org.lwjgl.opengl.GL32.;
公共类着色器{
private int program;
public Shader() {
program = glCreateProgram();
if (program == 0) {
System.err.println("ShaderProgram creation failed!!!, couldn't find valid memory location!");
}
}
public void addVertexShader(String text) {
addProgram(text, GL_VERTEX_SHADER);
}
public void addFragmentShader(String text) {
addProgram(text, GL_FRAGMENT_SHADER);
}
public void addGeometryShader(String text) {
addProgram(text, GL_GEOMETRY_SHADER);
}
public void addProgram(String shaderText, int type){
int shader = glCreateShader(type);
if (shader == 0){
System.err.println("Shader creation failed!!!");
}
glShaderSource(shader, shaderText);
glCompileShader(shader);
if(glGetShader(shader, GL_COMPILE_STATUS) == 0){
System.err.println(glGetShaderInfoLog(shader, 2048));
}
glAttachShader(program, shader);
}
public void compile(){
glLinkProgram(program);
if (glGetProgram(program, GL_LINK_STATUS) == 0){
System.err.println(glGetProgramInfoLog(program, 2048));
}
glValidateProgram(program);
if(glGetProgram(program, GL_VALIDATE_STATUS) == 0){
System.err.println(glGetProgramInfoLog(program, 2048));
}
}
public void bind(){
glUseProgram(program);
}
}`
主要java类:
'公共类Main{
Mesh mesh;
Shader shader;
public Main() {
init();
mesh = new Mesh();
Vertex[] data = new Vertex[]{new Vertex(new Vector2f(500, 0)),
new Vertex(new Vector2f(1000, 600)),
new Vertex(new Vector2f(0, 600))};
mesh.addVertices(data);
shader = new Shader();
shader.addVertexShader(Util.loadShader("vertexShader.vs"));
shader.addFragmentShader(Util.loadShader("fragmentShader.fs"));
shader.compile();
renderLoop();
}
private void MainLoop() {
new Thread("Update"){
public void run(){
long lastTime = System.nanoTime();
final double ns = 100000000 / 60;
double delta = 0;
while (!Display.isCloseRequested()) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while (delta > 1) {
delta--;
update();
}
}
}
}.start();
}
private void renderLoop() {
MainLoop();
long Timer = System.currentTimeMillis();
int fps = 0;
while (!Display.isCloseRequested()) {
glClear(GL_COLOR_BUFFER_BIT);
render();
Display.update();
fps++;
if(System.currentTimeMillis() - Timer > 1){
System.out.println("FPS: " + fps);
Display.setTitle("The Unknown Path || FPS: " + fps);
fps = 0;
Timer += 1000;
}
}
}
private void update() {
}
private void render() {
shader.bind();
mesh.render();
}
private void init() {
try {
Display.setDisplayMode(new DisplayMode(1000, 600));
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1000, 600, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
// glEnable(GL_TEXTURE_2D);
System.out.println(glGetString(GL_VERSION));
}
public static void main(String[] args) {
Main m = new Main();
System.exit(0);
}
}`
应该是这样的:
glOrtho(-1,1,1,-1,-1,1);
而不是这个:
格洛托(0,1000,600,0,-1,1)
我的屏幕宽度是1000,高度是600。
在Hello Triangle教程中提到,着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。 前面的教程里我们简要地触及了一点着色器的皮毛,并了解了如何恰当地使用它们。现在我们会用一种更加广泛的形式详细解释
WebGL的着色器代码分为顶点着色器代码和片元着色器代码两部分,顶点着色器代码会在GPU的顶点着色器单元执行,片元着色器代码会在GPU的片元着色器单元执行,在WebGL渲染管线流程中,或者说GPU的渲染流程中,顶点着色器代码先执行处理顶点,得到一系列片元,然后再执行片元着色器代码处理片元。 main()函数 顶点着色器和片元着色器代码都有一个唯一的主函数main(),attribute、varyi
标准着色器 Unity 标准着色器是一个内置着色器,具有非常全面的功能。它可以用于渲染『真实世界』的对象,例如,石头、木材、玻璃、塑料和金属,并支持各种各样的着色器类型和组合。通过使用或不使用材质编辑器中的各种纹理插槽和参数,可以很容易地启动或禁用其功能。 标准着色器还包括一个称为 物理着色器(Physically Based Shading,PBS) 的高级光照模型。物理着色器以模拟真实世界的方
我似乎无法理解从顶点到像素的OpenGL管道过程。 有人能告诉我顶点法线在这两种着色技术中有多重要吗?据我所知,在gouraud中,在每个顶点计算照明,然后在顶点之间的多边形上插值结果颜色(在光栅化之前,这是在片段操作中完成的吗?),phong着色包括首先插值顶点法线,然后计算每个法线上的照明。 另一件事是,当凹凸贴图应用于一个平面(2个三角形)和一个砖纹理作为漫反射时,使用其相应的凹凸贴图,所有
在一个教程之后,我将尝试使用FreeType在OpenGL中渲染文本。因此,灰度8位图像用作每个字符的纹理,使图像的每个字节对应于纹理的红色分量。 为了以其他颜色呈现文本,建议您使用着色器。但是,当使用提供的着色器时,我看到的不是彩色字母,而是彩色框,好像根本没有纹理。 以下是没有着色器时的效果: 这是它在着色器中的外观: (盒子的位置也会发生变化) 以下是顶点着色器代码: 这是片段着色器代码:
在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。 废话不多说,我们直接先看一个几何着色器的例子: #version 330 core layout