标签: opengl

着色器创建Opengl

我在Youtube上使用OpenGl 3和BennyBox的教程.

使用此方法:

static void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string& errorMessage){
    GLint success = 0;
    GLchar error [1024] = {0};

    if(isProgram){
        glGetProgramiv(shader, flag, &success);
    }else{
        glGetShaderiv(shader, flag, &success);
    }
    if(success == GL_FALSE){
        if(isProgram){
            glGetProgramInfoLog(shader, sizeof(error), NULL, error);
        }else{
            glGetShaderInfoLog(shader,sizeof(error), NULL, error);
        }
        std::cerr<< errorMessage<< ": " << error<< "'"<<std::endl; 
    }
} 
Run Code Online (Sandbox Code Playgroud)

我应该能够加载着色器文件(片段和顶点着色器).它适用于基本着色器,但是当我尝试将它们修改为该点时:

#version 120

attribute vec3 position;
attribute vec2 texCoord;

varying vec2 texCoord;

void main(){
    gl_Position = vec4(position, 1.0);
    texCoord0 = texCoord;
}
Run Code Online (Sandbox Code Playgroud)

我得到:

Error compiling shader!: …
Run Code Online (Sandbox Code Playgroud)

opengl shader

-1
推荐指数
1
解决办法
525
查看次数

OpenGL 3.0到3.2

我正在将我的代码从OpenGL 3.0升级到3.3(或者甚至可能是4.x),但我遗漏了一些东西,因为屏幕是黑色的.

这个问题最接近的答案是openGL 3.1中的三角形,但3.2中没有.这里的解决方案是使用兼容性配置文件.使用核心配置文件实现正确的唯一提示是"实际使用具有完整顶点和片段着色器的适当核心配置文件GL命令序列".

我遇到的问题是,在整个下午阅读规范,教程和示例后,我看不出我的代码出错了.我目前正在开发一个演示程序来回收我使用的一些代码,你可以找到整个演示,目前只是在gitub渲染一个三角形.

多汁的比特如下:

顶点代码是:

#version 150
in vec3 aVertex;

void main()
{   
    gl_Position = aVertex;
}
Run Code Online (Sandbox Code Playgroud)

片段代码是:

#version 330 core
out vec4 oFragColor;

void main()
{
    oFragColor = vec4(1.0, 1.0, 1.0, 1.0);       
}
Run Code Online (Sandbox Code Playgroud)

编译着色器的过程如下:

int status = 0;
char logstr[256];

const GLchar* vbuff[1] = {vertex_code.c_str()};

unsigned int vertex_id = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_id, 1, vbuff, NULL);
glCompileShader(vertex_id);

glGetShaderInfoLog(vertex_id, 256, NULL, logstr);

glGetShaderiv(vertex_id, GL_COMPILE_STATUS, &status);
if(! status)
{
    glDeleteShader(vertex_id);    
    throw std::runtime_error(logstr);
} …
Run Code Online (Sandbox Code Playgroud)

c++ opengl

-1
推荐指数
1
解决办法
100
查看次数

如何使用GLSLshader :: operator []

我一直在阅读一本关于OpenGL的书,上面写着你可以使用GLSLshader :: operator []和我希望该位置获取该位置的属性的名称.但是当我使用它时(例子如下),程序崩溃了.

GLuint program_id;
...
glLinkProgram(program_id);
...
...
...
glEnableVertexAttribArray(program_id["position");
glVertexAttribPointer(program_id["position"], ... );
Run Code Online (Sandbox Code Playgroud)

当我调试它时返回105,即使我希望它返回0.我已指定该位置应为0,当我硬编码时,它按预期工作:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ... );
Run Code Online (Sandbox Code Playgroud)

这是顶点着色器的行:

layout(location = 0) in vec3 position;
Run Code Online (Sandbox Code Playgroud)

我不确定我是否误解了如何使用它.到目前为止,我总是硬编码属性位置,但我希望能够这样做.我知道我也可以用

glGetAttribLocation(program_id, "position");
Run Code Online (Sandbox Code Playgroud)

这工作(它返回我指定的位置),但着色器["位置"]看起来更清晰,如果使用[]运算符是一种方法,我想知道如何做而不是只是找到一个努力使其发挥作用.

所以我的问题是你可以使用GLSLshader :: operator []如shader ["position"]来获取属性的位置吗?如果是这样,你能想到我可能正在做的那些使它无效吗?

c++ opengl

-1
推荐指数
1
解决办法
33
查看次数

glDraw*返回GL_INVALID_ENUM

我正在尝试在OpenGL中渲染一些对象,但即使我glDrawElements用正确的模式调用它,它仍然给了我一个GL_INVALID_ENUM.这是AMD的CodeXL记录的呼叫记录,从设置到渲染:

glBindVertexArray(1) 

... creating shaders/programs and getting uniform locations ...

# the vertex buffer
glGenBuffers(1, 0x008A945C) 
glBindBuffer(GL_ARRAY_BUFFER, 1) 
glBufferData(GL_ARRAY_BUFFER, 96, 0x008A94A0, GL_STATIC_DRAW) 

# the element index buffer
glGenBuffers(1, 0x008A9460) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2) 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 96, 0x008A9508, GL_STATIC_DRAW) 

glClearColor(0.12, 0.63999999, 0.55000001, 1) 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 


glEnableVertexAttribArray(0) 
glUseProgram(1)

glUniformMatrix4fv(0, 1, FALSE, ... MVP Matrix ...)
glBindBuffer(GL_ARRAY_BUFFER, 1) 
glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 0x00000000) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2) 


glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, 0x00000000) # GL_INVALID_ENUM here <----


glUseProgram(0)
glDisableVertexAttribArray(0) 
wglSwapBuffers(0x09011214) 
Run Code Online (Sandbox Code Playgroud)

我已经尝试换glDrawElementsglDrawArrays(GL_QUADS, …

c++ opengl glew glfw

-1
推荐指数
1
解决办法
317
查看次数

OpenGL/C++ - 转换和VBOs/Shader不让我转换?

我实际上学习了一些OpenGL,我设法加载网格并在窗口中显示它.然后我用SDL做了一个函数,让我用箭头键旋转网格.但是当我潜入Shaders时我做了一些改变,但我不能为3D模型进行简单的旋转.

这是我的绘图功能:

        glMatrixMode(GL_MODELVIEW); //set the matrix to model view mode

        glPushMatrix(); // push the matrix

        glRotatef(1.0,0.0,0.0,1.0); //apply transformation

        //Primer buffer, modelo
        glBindBuffer(GL_ARRAY_BUFFER, _vboID);

        glEnableVertexAttribArray(0);

        glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0);

        glDrawArrays(GL_TRIANGLES, 0,vertices.size());

        glDisableVertexAttribArray(0);

        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glPopMatrix();//pop the matrix

        glMatrixMode(GL_PROJECTION); // Apply projection matrix again
Run Code Online (Sandbox Code Playgroud)

Theese是我的着色器:

片段着色器(仅用于给出颜色)

#version 130

out vec3 color;

void main()
{
    color = vec3(0.0,0.5,1.0);

}
Run Code Online (Sandbox Code Playgroud)

顶点着色器(用它来乱搞并尝试):

    #version 130

in vec3 vertexPosition;

void main()
{
    gl_Position.x = vertexPosition.x;
    gl_Position.y = vertexPosition.y-1.0;
    gl_Position.z = vertexPosition.z;
    gl_Position.w = 1.0; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl sdl vbo

-1
推荐指数
1
解决办法
577
查看次数

glTranslatef()方法的目的是什么?

我是openGl的初学者.你能告诉我一下吗?

glTranslatef();  
glScalef();
glBegin ();
Run Code Online (Sandbox Code Playgroud)

我在谷歌搜索过它们但无法得到答案.

谢谢

opengl

-1
推荐指数
1
解决办法
7325
查看次数

OpenGL版本问题

我正在使用OpenGL,并且我正在使用的版本存在一些问题.当我检查我的版本时glGetString(GL_VERSION),我得到"4.2.0 - Build 10.18.10.3574".我有以下问题:

  1. 在一种方法中,我使用固定管道进行渲染,但我知道从OpenGL 3.1中删除了对固定管道的支持,那么我的代码如何与4.2一起工作?我使用的API一样glTranslatef(),glMatrixMode(GL_PROJECTION).我认为这些都已弃用,仅适用于OpenGL 1.1.那么当我将上下文字符串作为OpenGL 4.2时,代码是如何工作的?我想我必须使用OpenGL 1.1,但为什么上下文版本是4.2?

  2. 当我使用着色器时,我使用以下代码创建3.1或更高版本的上下文.我使用的着色器是旧的着色器,它与OpenGL 2.0兼容,并且具有"属性","变化"等关键字,不应与OpenGL 3.1或更高版本一起使用.我应该将我的着色器更新为OpenGLSL 3.1,比如使用"in","out"等.还有一些不赞成的东西,比如GL_LINE_SMOOTH_HINT,glMatrixMode(GL_PROJECTION).我认为这些东西已经从OpenGL 3.0中弃用了.那么这些东西如何与GL上下文3.1及更高版本一起使用?

创建上下文3.1或更高版本的代码

if ( 0 == (m_tempContext = ::wglCreateContext( m_pDC->GetSafeHdc() ) ) )
{
    AfxMessageBox(_T("wglCreateContext failed."));
    return FALSE;
}
if ( FALSE == ::wglMakeCurrent( m_pDC->GetSafeHdc(), m_tempContext ) )
{
    AfxMessageBox(_T("wglMakeCurrent failed."));
    return FALSE;
}
int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
    WGL_CONTEXT_MINOR_VERSION_ARB, 1,
    WGL_CONTEXT_FLAGS_ARB, 0,
    0
};

if(wglewIsSupported("WGL_ARB_create_context") == 1)
{
m_hRC = wglCreateContextAttribsARB(m_pDC->GetSafeHdc() ,0, attribs); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl

-1
推荐指数
1
解决办法
113
查看次数

缓冲区是否在两个GLSL程序之间共享?

在我的应用程序中,我需要通过glUseProgram(程序)在两个GLSL程序之间切换.我想知道我是否写道:

glUseProgram(program1)
buf1 = glGenBuffers(1)
glUseProgram(program2)
buf2 = glGenBuffers(1)
Run Code Online (Sandbox Code Playgroud)

buf1和buf2可以是相同的值吗?即每个程序都有自己的缓冲区,还是共享缓冲区?

opengl pyopengl

-1
推荐指数
1
解决办法
39
查看次数

在GLSL 1.30上编译片段着色器时出错

以下片段着色器有什么问题?它可以在GLSL 4.0下编译正常,但在GLSL 1.30上失败。

这是代码:

// Fragment Shader
"uniform sampler2D texture;\n"
"uniform sampler1D cmap;\n"
"uniform float minZ;\n"
"uniform float maxZ;\n"
"\n"
"void main() {\n"
"    float height = texture2D(texture,gl_TexCoord[0].st);\n"
"    float lum = (height-minZ)/(maxZ-minZ);\n"
"    if (lum > 1.0) lum = 1.0;\n"
"    else if (lum < 0.0) lum = 0.0;\n"
"    gl_FragColor = texture1D(cmap, lum);\n"
"}"
Run Code Online (Sandbox Code Playgroud)

这些是错误:

FRAGMENT glCompileShader "" FAILED
FRAGMENT Shader "" infolog:
0:7(2): error: initializer of type vec4 cannot be assigned to variable of type float
0:8(2): …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl

-1
推荐指数
1
解决办法
1008
查看次数

关于OpenGL中正交与透视的问题

我有一个围绕y轴旋转的3个顶点三角形.我发现"怪异"的一件事是GL默认正交投影中的归一化坐标.我使用过像SDL和SFML这样的二维库,几乎总是处理像素.你说你想要一个50x50像素的图像表面,这就是你得到的.所以最初我很难说从[-1,1]中限制我的顶点位置选择.

为什么正交坐标必须标准化?透视投影是否相同?如果是这样,你怎么说你希望你的对象的原点在z = -10?(我快速浏览矩阵m ath说透视是不同的.关于除以'w'创建同质(与标准化相同的东西?)坐标的东西,但我不确定).

gl_Position = View*Model*Project*Vertex;

我已经看到上面的等式,我很惊讶于着色器中使用的变量gl_Position如何既可以表示模型/对象的当前顶点的位置,又可以表示视图/投影的位置,或者相机.这是如何运作的?我通过乘法理解所有信息都存储在一个矩阵中,但OpenGL如何使用一个矩阵,其信息现在被组合起来说,"好吧,gl_Position的这部分/分数用于摄像机,而另一部分是信息该模型将要去哪里."?(顺便说一句,我不太确定Vertex vec4代表什么.我认为模型的所有顶点都在模型内部.任何想法?

还有一个问题,如果你只是想移动相机,例如在FPS游戏中你移动鼠标向上移动,但是除了相机之外没有任何物体被旋转或翻译(我认为),上面的等式会看起来像什么像这样?

gl_Position =查看*项目;

opengl 3d matrix

-2
推荐指数
1
解决办法
997
查看次数

标签 统计

opengl ×10

c++ ×6

glsl ×2

3d ×1

glew ×1

glfw ×1

matrix ×1

pyopengl ×1

sdl ×1

shader ×1

vbo ×1