Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 纹理不';在OpenGL中应用着色器时无法进行渲染_C_Opengl_Glsl_Shader_Opengl 4 - Fatal编程技术网

C 纹理不';在OpenGL中应用着色器时无法进行渲染

C 纹理不';在OpenGL中应用着色器时无法进行渲染,c,opengl,glsl,shader,opengl-4,C,Opengl,Glsl,Shader,Opengl 4,在教程之后,我将尝试使用FreeType在OpenGL中渲染文本。因此,灰度8位图像用作每个字符的纹理,其方式是图像的每个字节对应于纹理的红色分量 为了以其他颜色渲染文本,建议使用着色器。但是,当使用提供的着色器时,我看到的不是一个彩色字母,而是一个彩色框,好像根本没有涉及纹理 以下是没有着色器时的外观: 下面是使用着色器时的外观: (长方体也会移动其位置) 以下是顶点着色器代码: #版本330核心 vec4顶点中的布局(位置=0); 输出向量2; void main(){ gl_位置=向量

在教程之后,我将尝试使用FreeType在OpenGL中渲染文本。因此,灰度8位图像用作每个字符的纹理,其方式是图像的每个字节对应于纹理的红色分量

为了以其他颜色渲染文本,建议使用着色器。但是,当使用提供的着色器时,我看到的不是一个彩色字母,而是一个彩色框,好像根本没有涉及纹理

以下是没有着色器时的外观:

下面是使用着色器时的外观:

(长方体也会移动其位置)

以下是顶点着色器代码:

#版本330核心
vec4顶点中的布局(位置=0);
输出向量2;
void main(){
gl_位置=向量4(顶点.xy,0.0,1.0);
TexCoords=vertex.zw;
}
以下是片段着色器代码:

#版本330核心
在vec2-TexCoords中;
输出vec4颜色;
统一的二维文本;
颜色均匀;
void main(){
vec4 sampled=vec4(1.0,1.0,1.0,纹理(text,TexCoords).r);
颜色=文本颜色*采样;
}
下面是在屏幕上呈现的代码:

glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//这里是着色器
glUseProgram(shaderProgram);
glUniform4f(
glGetUniformLocation(着色器程序,“textColor”),
0.0f,1.0f,0.0f,1.0f
);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,texID);
glUniform1i(glGetUniformLocation(着色器程序,“文本”),0;
//在这里画
glBegin(GL_QUADS);
glTexCoord2f(1,0.);
glVertex2f(20/宽,20/高);
glTexCoord2f(0,0.);
glVertex2f(100/宽,20/高);
glTexCoord2f(0,1.);
glVertex2f(100/宽,100/高);
glTexCoord2f(1,1.);
glVertex2f(20/宽,100/高);
格伦德();
还有,下面是全部代码:

#include <stdio.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include <freetype2/freetype/freetype.h>

const unsigned int WIDTH = 640;
const unsigned int HEIGHT= 480;

const char *vertex_shader_src =
"#version 330 core\n"
"layout (location = 0) in vec4 vertex;\n"
"out vec2 TexCoords;\n"
"void main() {\n"
"gl_Position = vec4(vertex.xy, 0.0, 1.0);\n"
"TexCoords = vertex.zw;}\0";

const char *frag_shader_src = 
"#version 330 core\n"
"in vec2 TexCoords;\n"
"out vec4 color;\n"
"uniform sampler2D text;\n"
"uniform vec4 textColor;\n"
"void main() {\n"
"vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);\n"
"color = textColor * sampled;}\0";

int main() {

    // -------------------------------------------------------------------------
    // WINDOW INITIALIZATION

    GLFWwindow *window;

    glfwInit();
    window = glfwCreateWindow(640, 480, "SHADER", NULL, NULL);
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    glClearColor(0., 0. , 0., 1.);
    glColor4f(1., 1., 1., 1.);
    glPointSize(1.);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, (WIDTH*1.)/HEIGHT, 1., 0, 1., -1.);
    glViewport(0, 0, WIDTH, HEIGHT);
    // -------------------------------------------------------------------------
    // SHADER INITIALIZATION

    glewInit();

    int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertex_shader_src, NULL);
    glCompileShader(vertexShader);

    int fragShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragShader, 1, &frag_shader_src, NULL);
    glCompileShader(fragShader);

    int shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragShader);
    glLinkProgram(shaderProgram);

    glDeleteShader(vertexShader);
    glDeleteShader(fragShader);
    // -------------------------------------------------------------------------
    // TEXTURE FOR A SINGLE CHARACTER
    FT_Library ft;
    if (FT_Init_FreeType(&ft)) {
        printf("Error in FT_Init_FreeType\n");
        return 1;
    }

    FT_Face face;
    if (FT_New_Face(ft, "Ubuntu-R.ttf", 0, &face)) {
        printf("Error in FT_New_Face\n");
        return 1;
    }

    FT_Set_Pixel_Sizes(face, 0, 96);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    if (FT_Load_Char(face, 'A', FT_LOAD_RENDER)) {
        printf("Error in FT_Load_Char\n");
        return 1;
    }

    unsigned int texID;
    glGenTextures(1, &texID);
    glBindTexture(GL_TEXTURE_2D, texID);

    glTexImage2D(
        GL_TEXTURE_2D, 0, GL_RED,
        face->glyph->bitmap.width,
        face->glyph->bitmap.rows,
        0, GL_RED, GL_UNSIGNED_BYTE,
        face->glyph->bitmap.buffer
    );

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glBindTexture(GL_TEXTURE_2D, 0);
    FT_Done_Face(face);
    FT_Done_FreeType(ft);

    // -------------------------------------------------------------------------
    // MAIN LOOP

    while (!glfwWindowShouldClose(window)) {

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Shader here
        glUseProgram(shaderProgram);
        glUniform4f(
            glGetUniformLocation(shaderProgram, "textColor"),
            0.0f, 1.0f, 0.0f, 1.0f
        );

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, texID);
        glUniform1i(glGetUniformLocation(shaderProgram, "text"), 0);

        // Draw here
        glBegin(GL_QUADS);
        glTexCoord2f(1., 0.);
        glVertex2f(20. / WIDTH, 20. / HEIGHT);

        glTexCoord2f(0., 0.);
        glVertex2f(100. / WIDTH, 20. / HEIGHT);

        glTexCoord2f(0., 1.);
        glVertex2f(100. / WIDTH, 100. / HEIGHT);

        glTexCoord2f(1., 1.);
        glVertex2f(20. / WIDTH, 100. / HEIGHT);
        glEnd();
        glUseProgram(0);

        glFlush();
        glfwSwapBuffers(window);
        glfwPollEvents();

    }

    glDeleteProgram(shaderProgram);
    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;

}
#包括
#包括
#包括
#包括
#包括FT_FREETYPE_H
#包括
常量无符号整数宽度=640;
常量无符号整数高度=480;
常量字符*顶点着色器=
“#版本330核心\n”
“vec4顶点中的布局(位置=0);\n”
“输出vec2 TexCoords;\n”
“void main(){\n”
gl_位置=vec4(顶点.xy,0.0,1.0);\n
“TexCoords=vertex.zw;}\0”;
常量字符*frag\u着色器\u src=
“#版本330核心\n”
“在vec2 TexCoords中;\n”
“输出vec4颜色;\n”
“二维文本的统一采样器;\n”
“统一vec4 textColor;\n”
“void main(){\n”
vec4 sampled=vec4(1.0,1.0,1.0,纹理(text,TexCoords).r);\n
“color=textColor*sampled;}\0”;
int main(){
// -------------------------------------------------------------------------
//窗口初始化
GLFWwindow*窗口;
glfwInit();
window=glfwCreateWindow(640480,“着色器”,NULL,NULL);
glfwMakeContextCurrent(窗口);
glfwSwapInterval(1);
glClearColor(0,0,0,1.);
glColor4f(1,1,1,1.);
glPointSize(1.);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0,(宽*1.)/高,1,0,1.,-1.);
glViewport(0,0,宽度,高度);
// -------------------------------------------------------------------------
//着色器初始化
glewInit();
int vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1和vertex_shader_src,NULL);
glCompileShader(顶点着色器);
int fragShader=glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragShader,1和frag_shader_src,NULL);
glCompileShader(fragShader);
int shaderProgram=glCreateProgram();
glAttachShader(着色器程序、顶点着色器);
glAttachShader(着色器程序,fragShader);
GLLINK程序(着色器程序);
glDeleteShader(顶点着色器);
glDeleteShader(fragShader);
// -------------------------------------------------------------------------
//单个角色的纹理
图书馆;
if(FT_Init_FreeType(&FT)){
printf(“FT_Init_FreeType中的错误\n”);
返回1;
}
面部;
if(FT_New_Face(FT,“Ubuntu-R.ttf”、0和Face)){
printf(“FT\u New\u Face\n中的错误”);
返回1;
}
FT_设置_像素_大小(面,0,96);
glPixelStorei(GLU解包对齐,1);
glEnable(GL_纹理_2D);
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
if(FT_加载字符(面'A',FT_加载渲染)){
printf(“FT_Load_Char\n中的错误”);
返回1;
}
无符号整数texID;
glGenTextures(1和texID);
glBindTexture(GL_TEXTURE_2D,texID);
glTexImage2D(
GL_纹理_2D,0,GL_红色,
面->字形->位图.width,
面->字形->位图.rows,
0,GL_红色,GL_无符号字节,
面->字形->位图.buffer
);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glBindTexture(GL_TEXTURE_2D,0);
FT_Done_面(面);
FT_Done_FreeType(FT);
// -------------------------------------------------------------------------
//主回路
而(!glfwWindowShouldClose(窗口)){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//这里是着色器
glUseProgram(shaderProgram);
glUniform4f(
glGetUniformLocation(着色器程序,“textColor”),
0.0f,1.0f,0.0f,1.0f
);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,texID);
glUniform1i(glGetUniformLocation(着色器程序,“文本”),0;
//在这里画
glBegin(GL_QUADS);
glTexCoord2f(1,0.);
glVertex2f(20/宽,20/高);
glTexCoord2f(0,0.);
glVertex2f(100/宽,20/高);
glTexCoord2f(0,1.);
glVertex2f(100/宽,100/高);
glTexCoord2f(1,1.);
glVertex2f(20/宽,100/高);
格伦德();
谷氨酸