标签: shader

我的glsl着色器加载代码有什么问题吗?

问题是,着色器(非常简单的,因为我正在学习OpenGL)无法以看似随机的方式编译(并提供随机错误消息*).但是,相同的着色器在大约3或4次尝试后编译.这是代码:

Shader::Shader(GLenum Type,std::string filename)
{
    shader_type = Type;

    std::ifstream ifs(filename);
    if(!ifs)
        throw(std::runtime_error("File:"+filename+" not opened."));
    std::ostringstream stream;
    stream<<ifs.rdbuf();

    const GLchar* data = stream.str().c_str();

    handle = glCreateShader(shader_type);
    glShaderSource(handle,1,static_cast<const GLchar**>(&data),0);

    glCompileShader(handle);

    int status;
    glGetShaderiv(handle,GL_COMPILE_STATUS,&status);
    if(status == GL_FALSE)
    {
        int loglength;
        glGetShaderiv(handle,GL_INFO_LOG_LENGTH,&loglength);

        auto data = new char[loglength];

        glGetShaderInfoLog(handle,loglength,&loglength,data);

        std::string strdata(data);
        delete [] data;

        throw(std::runtime_error(strdata));
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,着色器最后没有缺少换行符,在最后一个分号后面有一个额外的空格,并使用制表符而不是空格.(正如互联网上各种旧帖所示!).

  • 以下是从同一顶点着色器生成的两条错误消息,而不是同时:

#version 330
in vec2 Position;
uniform mat4 transform;
void main()
{
    gl_Position = transform*vec4(Position,0.0f,1.0f);

}
Run Code Online (Sandbox Code Playgroud)

错误:

0(1) : error C0000: syntax error, unexpected $undefined …
Run Code Online (Sandbox Code Playgroud)

c++ opengl shader compiler-errors glsl

0
推荐指数
1
解决办法
4646
查看次数

删除现有着色器或程序(或获取其ID以执行此操作)

我有一个编译着色器或程序(不确定正确的术语),我需要删除它.

如何找到已编译程序和/或着色器的ID?

我知道它存在是因为调试器告诉我我正在尝试重新定义它,并且因为这个而无法再次编译它:

ERROR: 0:1: error(#198) Redefinition at_coord_Y
ERROR: 1:1: error(#248) Function already has a body main
Run Code Online (Sandbox Code Playgroud)

着色器源的第一行是:

"in float at_coord_Y;"
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式使用它来找到Id吗?

编辑1:希望澄清一下,着色器无法编译,因为它已经存在.

    GLint compiled = UNDEFINED_VALUE;

    const GLchar* shaderSrc[] = {
        "in float at_coord_Y;",
        "void main()",
        "{",
              // Dont mind the empty space
        "}"
    };

    GLuint shaderId = glCreateShader(GL_VERTEX_SHADER);

    glShaderSource(shaderId, glNumberOfLines(shaderSrc), shaderSrc, NULL);

    glCompileShader(shaderId);  // Fail to compile because it already exists. Redefinition error.

    glGetShaderiv(shaderId), GL_COMPILE_STATUS, &compiled); // Compile status GL_FALSE
Run Code Online (Sandbox Code Playgroud)

但是如何找到现有着色器(或程序)的Id?

opengl shader

0
推荐指数
1
解决办法
726
查看次数

未定义的变量"gl_position"

我试图绘制2个简单的三角形没什么特别的,这是着色器代码:

#version 430 core

layout(location=0) in vec4 vPosition;
void
main()
{
    gl_position=vPosition;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,着色器代码非常小并且没有什么特别之处.当我尝试编译这段代码时,我得到了一个

未定义的变量"gl_position"

我不明白为什么因为我认为所有的gl _...变量都是全局变量.

我能做什么 ?

opengl shader glsl

0
推荐指数
1
解决办法
1397
查看次数

GLSL语法错误:"in"解析错误

我正在尝试在我的程序中使用着色器,但我得到了非常奇怪的错误...

Vertex shader failed to compile with the following error
ERROR: 0:6: error(#132) Syntax error: "in" parse error
ERROR: error(#273) 1 compilation errors.  No code generated
Run Code Online (Sandbox Code Playgroud)

我认为问题在于文件读取,但在尝试了很多方法后,它仍然无法正常工作.

所以这是我的代码:

bool ShaderProgram::LoadShaderFile(const char* shader_path, GLuint& shader_id)
{
    ifstream oFileStream(shader_path);
    if(oFileStream)
    {
        // Load shader code
        string sShaderSource;
        sShaderSource.assign((istreambuf_iterator<char> (oFileStream) ), istreambuf_iterator<char> () );

        // Forward shader code to OGL
        const GLchar* chShaderSource = sShaderSource.c_str() + '\0';
        printf("%s", chShaderSource);
        glShaderSource(shader_id, 1, (const GLchar**) &chShaderSource, NULL);


        return true;
    }
    else
        return false;

}
Run Code Online (Sandbox Code Playgroud)

我的着色器: …

c++ opengl shader glsl parse-error

0
推荐指数
1
解决办法
2894
查看次数

Opengl 3.3没有绘制任何东西.使用GLSL 330 Core

我正在关注本网站的指南并停止了第2课.首先,我尝试了自己的代码,但是在它不起作用之后,我只是从网站上获取了代码.除了这个之外,它仍然没有画任何东西glClearColor.

我做了什么:

  1. 检查编译和链接.工作良好
  2. 检查错误.不确定我是否做得对,但看起来一切都好(我得到1280错误,但我已经读过GLEW会导致它并且可以忽略它).
  3. glUseProgram通过主循环移动但没有得到任何结果.
  4. 更改颜色并尝试修改着色器.依然没有

我将发布我目前的代码(来自网站的原始代码):

main.cpp中

#include <stdio.h>
#include <stdlib.h>
#include <glew.h>
#include <glfw3.h>
#include <glm/glm.hpp>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>


int max(int i, int j)
{
    if (i > j) return i;
    return j;
}


GLuint LoadShaders(const char * vertex_file_path, const char * fragment_file_path){

    // Create the shaders
    GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);

    // Read the Vertex Shader code from the file
    std::string VertexShaderCode;
    std::ifstream VertexShaderStream(vertex_file_path, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl shader

0
推荐指数
1
解决办法
940
查看次数

OS上的OpenGL:shader将无法编译

我在IOS上使用OpenGL ES上的bevor,但现在我想在操作系统上尝试自己的OpenGl.我有测试的基本着色器,但不知怎的,它不会编译?有什么我需要了解的OpenGl,那里有什么不同.

这里着色器:

attribute vec4 position;
attribute vec2 texCoord;
attribute vec3 normal;


varying lowp vec2 vTexCoord;

uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;

void main()
{
    vTexCoord = texCoord;

    gl_Position = projectionMatrix*modelViewMatrix * position;
}
Run Code Online (Sandbox Code Playgroud)

分段:

uniform sampler2D uSampler;

varying lowp vec2 vTexCoord;

void main()
{
    lowp vec4 texCol = texture2D(uSampler, vTexCoord);

    gl_FragColor = vec4(texCol.rgba);
}
Run Code Online (Sandbox Code Playgroud)

出现的错误是:

错误:0:9:'vec2':语法错误:语法错误

opengl shader operating-system glsl

0
推荐指数
1
解决办法
257
查看次数

为什么GPU外的顶点变换与GPU内部的顶点变换不一样?

我们知道如果我们想在世界空间中绘制某些东西,我们需要通过视图和投影矩阵来乘以我们的数据.现在我需要我的任务是在着色器外部进行顶点变换并直接发送转换后的顶点.像这样:

初始化矩阵

glm::mat4 view, projection;
view = glm::lookAt(this->cameraPos, this->cameraPivot, this->Up);
projection = glm::perspective(glm::radians(60.0f), (float)screenWidth / (float)screenHeight, 0.1f, 100.0f);
Run Code Online (Sandbox Code Playgroud)

vector<glm::vec3> data;
glm::mat4 projection, view;
...
data.push_back(glm::vec3(projection * view * glm::vec4(0.0, 0.0, 0.5, 0.0)));
data.push_back(glm::vec3(projection * view * glm::vec4(0.0, 0.5, 0.5, 0.0)));
data.push_back(glm::vec3(projection * view * glm::vec4(0.5, 0.5, 0.5, 0.0)));
data.push_back(glm::vec3(projection * view * glm::vec4(0.5, 0.0, 0.5, 0.0)));
...
shader.set();
GLuint VAO,VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &wVBO);
glBindVertexArray(wVAO);
glBindBuffer(GL_ARRAY_BUFFER, wVBO);
glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof(vector<glm::vec3>), &data.data(), GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl shader matrix

0
推荐指数
1
解决办法
93
查看次数

Visual Studio 2015中OpenGL 4实现中的纹理单元数(GL_TEXTUREi)

我使用OpenGL 4进行Visual C++中的一些纹理操作.我正在研究的平台是Visual Studio 2015.看过GL_TEXTUREi纹理单元的实现后,我发现总数限制在0到31之间(总共32个).

这是否意味着可以同时访问的最大纹理数量限制为32?

这是来自实现源代码:

#define GL_TEXTURE0 0x84C0
#define GL_TEXTURE1 0x84C1
#define GL_TEXTURE2 0x84C2
#define GL_TEXTURE3 0x84C3
#define GL_TEXTURE4 0x84C4
#define GL_TEXTURE5 0x84C5
#define GL_TEXTURE6 0x84C6
...
#define GL_TEXTURE31 0x84DF
Run Code Online (Sandbox Code Playgroud)

c++ opengl shader glsl

0
推荐指数
1
解决办法
1046
查看次数

在片段着色器中读取自定义纹理格式

我正在创建一个NES模拟器,我正在尝试将功能(如果适用)卸载到GPU.令我印象深刻的一个想法是以自定义格式将屏幕像素输出到缓冲区,其方式是对每个像素的属性进行编码,以便着色器可以确定如何显示它们.这将从模拟器中最热门的功能之一卸载相当多的逻辑/分支.

以下是使用每像素2个字节对​​单个像素进行编码的示例:

字节1(调色板索引):bbbb ssss

  • b:背景像素调色板索引
  • s:精灵像素调色板索引

字节2(像素属性):bbss rgbp

  • b:2位背景像素值
  • s:2位精灵像素值
  • r:强调红色
  • g:强调绿色
  • b:强调蓝色
  • p:精灵像素优先级

我对编写着色器比较新,所以我的第一个问题是:这甚至可能吗?在我所做的研究中,似乎纹理需要采用特定的格式才能从每个像素中读取颜色信息,而我的自定义2字节"颜色"格式甚至不代表颜色 - 而且它本身.如果可能的话,可以采取什么样的高级方法来实现这一目标?我计划使用vulkan,但任何更普遍适用的方法(因为它与着色器有关)都是受欢迎的.

opengl shader vulkan

0
推荐指数
1
解决办法
187
查看次数

OpenGL代码每次都不会显示相同的内容?

当运行程序两次时,它在运行时不会显示相同的结果,即使我使用相同的可执行文件.

这里有一点背景:

我用Sierra 10.13在MacAir上编程,我的IDE是Xcode 10.1.

我发现我的问题是由顶点着色器中添加变换矩阵引起的:

// This code is not working
#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec2 textureCoords;

out vec2 pass_textureCoords;

uniform mat4 transformM;

void main() {
    gl_Position = transformM * vec4(position, 1.0);
    pass_textureCoords = textureCoords;
}
Run Code Online (Sandbox Code Playgroud)

我以这种方式加载transformM矩阵(我正在使用GLM库进行数学运算):

void LoadMatrix(int location, glm::mat4 matrix) {
    glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]);
}
Run Code Online (Sandbox Code Playgroud)

这里的位置是:

uniformName = "transformM";
location = glGetUniformLocation(_shaderID, uniformName.c_str());
Run Code Online (Sandbox Code Playgroud)

(我保持简单但你可以在这里找到完整的代码:https://github.com/Cuiyere/Ecosystem)

事实上,我希望我的代码能够渲染一个立方体并旋转它,但它并没有显示出50%的时间.

我不明白为什么会出现这个问题.我检查了我的代码一百次,检查了docs.gl网站,将ThinMatrix的代码与我的代码进行了比较(即使用Java编写,整体结构和OpenGL功能仍然完全相同),检查OpenGL论坛,但据我所知看,没有人遇到过这个问题.

我认为这是OpenGL使用顶点着色器的一个问题,但我不能肯定.

c++ opengl shader glsl glm-math

0
推荐指数
1
解决办法
91
查看次数