当前位置: 首页 > 知识库问答 >
问题:

GLSL-无法从“常量高4-组件VEC4”转换为“缺省出高3-组件VEC3”

翟浩穰
2023-03-14

我在2GPU.com上学习OpenGL的教程,我被着色器部分卡住了。我在论坛上读过关于这个错误的文章,但我只找到了当人们使用VEC3作为VEC4时出现错误的例子,但我不认为我犯了那个错误,至少不是我设法看到的:

#version 430

void main(void) {
    vec4 vertices[3];
    vertices[0] = vec4( 0.25, -0.25, 0.5, 1.0);
    vertices[1] = vec4(-0.25, -0.25, 0.5, 1.0);
    vertices[2] = vec4( 0.25, 0.25, 0.5, 1.0);

   gl_Position = vertices[gl_VertexID];
}
#version 430

out vec3 color;

void main(void) {
    color = vec4(0.0, 1.0, 0.0, 1.0);
}
Vertex shader failed to compile with the following errors:
ERROR: 0:6: error(#160) Cannot convert from: "const highp 4-component vector of vec4" to: "default out highp 3-component vector of vec3"
ERROR: error(#273) 1 compilation errors.  No code generated


Could not compile shader!

我尝试像这样转换顶点数据:

gl_Position = vec4(vertices[gl_VertexID]);
glPosition = vec3(vertices[glVertexID].xyz); (Incase gl_Position was actually a vec3)

但没有成功。

任何帮助都很感激!

public class ShaderLoader {

public static int createShader(String vertexShaderSource, String fragmentShaderSource) {
    int vertex_shader = loadShader(vertexShaderSource, GL20.GL_VERTEX_SHADER);
    int fragment_shader = loadShader(fragmentShaderSource, GL20.GL_FRAGMENT_SHADER);

    int link_result = 0;

    int programID = GL20.glCreateProgram();
    GL20.glAttachShader(programID, vertex_shader);
    GL20.glAttachShader(programID, fragment_shader);

    GL20.glLinkProgram(programID);
    GL20.glValidateProgram(programID);
    GL20.glGetProgrami(programID, link_result);

    if(link_result == GL11.GL_FALSE) {
        System.out.println("Could not link program!");
        System.exit(0);
    }
    return programID;
}

public static int loadShader(String filename, int type) {
    StringBuilder builder = new StringBuilder();
    try {
        BufferedReader reader = new BufferedReader(new FileReader("src/shaders/" + filename));
        String line;
        while((line = reader.readLine()) != null) {
            builder.append(line).append("\n");
        }
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    int shaderID = GL20.glCreateShader(type);
    GL20.glShaderSource(shaderID, builder);
    GL20.glCompileShader(shaderID);
    if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
        System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
        System.out.println("Could not compile shader!");
        System.exit(0);
    }
    return shaderID;
}
int shaderProgram = ShaderLoader.createShader("vertexShader.txt", "fragmentShader.txt");
if(type == GL20.GL_VERTEX_SHADER) {
        System.out.println("Vertex: \n" + builder);
    } else if(type == GL20.GL_FRAGMENT_SHADER) {
        System.out.println("Fragment: \n" + builder);
    }
Vertex: 
#version 430

void main(void) {
    vec4 vertices[3];
    vertices[0] = vec4( 0.25, -0.25, 0.5, 1.0);
    vertices[1] = vec4(-0.25, -0.25, 0.5, 1.0);
    vertices[2] = vec4( 0.25, 0.25, 0.5, 1.0);

   gl_Position = vertices[gl_VertexID];
}

Fragment: 
#version 430

out vec4 color;

void main(void) {
    color = vec4(0.0, 1.0, 0.0, 1.0);
}

共有1个答案

薛弘济
2023-03-14

您错误地使用了getprogrami()函数。第二个参数是告诉函数要返回哪个内部标志的值,在本例中是gl20.link_status。然后将此函数的返回值赋给link_result变量。所以台词:

GL20.glGetProgrami(programID, link_result);

应改为:

link_result = GL20.glGetProgrami(programID, GL20.LINK_STATUS);
 类似资料:
  • 现在我们熟悉了组件基础知识,可以做一些更有趣的事情。

  • Examples Using the `withRouter` utility 如果你想应用里每个组件都处理路由对象,你可以使用withRouter高阶组件。下面是如何使用它: import { withRouter } from 'next/router' const ActiveLink = ({ children, router, href }) => { const style =

  • 虽然在组件内部可以使用 this.context.router 来实现导航,但许多应用想要在组件外部使用导航。使用Router组件上被赋予的history可以在组件外部实现导航。 // your main file that renders a Router import { Router, browserHistory } from 'react-router' import routes fr

  • 在React中,高阶组件是重用组件逻辑的一项高级技术。高阶组件并不是React API的一部分。高阶组件源自于React生态。 具体来说,高阶组件是一个函数,能够接受一个组件并返回一个新的组件。 const EnhancedComponent = higherOrderComponent(WrappedComponent); 组件是将props转化成UI,然而高阶组件将一个组价转化成另外一个组件

  • 我试图将我的类组件转换为功能组件,但我的过滤器不再工作了。 主要的错误是当我想转换listProducts因为我不知道如何定义与useState为这种情况下的preState 如何能为情况更新状态? 这是我的密码 类组件 功能成分