标签: opengl

从obj文件中绘制模型

我正在尝试用openGl编写一个obj查看器.这个程序只需绘制模型面的线条,所以我需要加载:

  • 顶点:有时是3D,有时是4D;
  • faces:索引列表,随机长度;

现在我只加载obj文件,每面有3个元素,所以我可以在GL_TRIANGLE模式下绘制元素,但是我遇到了一些模型的麻烦:

http://people.sc.fsu.edu/~jburkardt/data/obj/icosahedron.obj

加载阶段似乎运行良好,我认为问题出在render()函数中:

static void render(void)
{
    glClearColor( 0.0f, 0.0f, 0.0, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glBindBuffer(GL_ARRAY_BUFFER, g_resources.vertex_buffer);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(
        3,                                /* size */
        GL_FLOAT,                         /* type */
        3*sizeof(GLfloat),                /* stride */
        (void*)0                          /* array buffer offset */
    );

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_resources.element_buffer);

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glDrawElements(
        GL_TRIANGLES,           /* mode */
        theModel->face.size(),  /* count */
        GL_UNSIGNED_INT,        /* type */
        (void*)0                /* element array buffer offset */
    );

    glDisableClientState(GL_VERTEX_ARRAY);

    glutSwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)

我还有一些问题:

  • indeces从1或0开始?
  • 什么是关于indeces枚举?是顺时针方式吗?
  • 这是一个很好的解决方案,三角形超过3个三角形?

c++ opengl

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

规范化glTranslatef()

glTranslate()的参数指定原点转换的单位数量.因此,有可能超越显示器.有没有办法规范我们移动的数量,以便我们不超出绘图区域?

c opengl

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

让GLSL 1.5在Mac OS X上运行

我正在尝试在我的程序中创建自己的顶点和片段着色器(这基本上是一个非常简单的程序,用VBO显示一个三角形).但是,当我尝试运行它时,我总是会看到一个没有任何显示的黑屏.我检查了编译日志,它返回没有错误.我还没有使用我自己的自定义着色器运行程序,这让我想知道我在这里做错了什么.我在OpenGL 3.2和GLSL 1.5上运行我的代码

以下是我正在尝试运行的代码


GLuint vbo;

GLfloat data[] = {0.0, 0.0, -5.0,
                  1.0, 0.0, -5.0,
                  1.0, 1.0, -5.0
};

const char *vertexShader = "\n\
#version 150\n\
\n\
layout (location=0) in vec4 position;\n\
void main()\n\
{\n\
gl_Position = position;\n\
}\n\
";

const char *fragmentShader = "\n\
#version 150\n\
\n\
out vec4 outColor;\n\
\n\
void main()\n\
{\n\
    outColor = vec4(1.0, 0.0, 0.0, 1.0);\n\
}";


- (void)drawRect:(NSRect)dirtyRect
{
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    glUseProgram(programId);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glEnableClientState(GL_VERTEX_ARRAY);

    glVertexPointer(3, …
Run Code Online (Sandbox Code Playgroud)

opengl macos shader objective-c

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

Coord纹理数组与glDrawElements无法正常工作

我的程序的目的是加载和显示每个面上具有相同纹理的简单立方体.但问题是输出不是很好(只有4个面被正确纹理化).我在纹理数组中尝试了很多坐标组合,但大多数情况下它更糟糕.是否可以使用glDrawElements函数正确设置纹理?

#define OFFSET_BUFFER(bytes) ((GLfloat *)NULL + bytes)

GLfloat vertices[] =
{
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    1.0, 1.0, -1.0,
    -1.0, 1.0, -1.0,
    -1.0, -1.0, 1.0,
    1.0, -1.0, 1.0,
    1.0, 1.0, 1.0,
    -1.0, 1.0, 1.0,
};

GLubyte indices[] =
{
    0, 1, 2, 3,
    4, 7, 6, 5,
    0, 4, 5, 1,
    3, 2, 6, 7,
    0, 3, 7, 4,
    1, 5, 6, 2
};

GLfloat textures[] =
{
    0,0, 1,0, 1,1, 0,1,
    0,1, 1,1, 1,0, 0,0,
    /*//0,0, 1,0, 1,1, …
Run Code Online (Sandbox Code Playgroud)

arrays opengl textures sdl cube

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

OpenGL中的字体度量

Java(FontMetrics)中是否有任何字体指标?

例如:

FontMetrics fm = g2.getFontMetrics();
Rectangle2D rect = fm.getStringBounds(node.getText(), g2);
Run Code Online (Sandbox Code Playgroud)

java opengl fonts metric fontmetrics

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

Linux下OpenGL中的分段错误

我正在学习一些教程并提出以下代码:

// rendering.cpp

#include "rendering.h"
#include <GL/gl.h>
#include <GL/freeglut.h>

void DrawGLScene()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
}

int InitGL(int argc, char** argv)
{
    /*glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);*/

    glutInit(&argc, argv);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutDisplayFunc(DrawGLScene);
    glutCreateWindow("Swimming Simulation");
    glutMainLoop(); // Enter GLUT's main loop

    return true;
}
Run Code Online (Sandbox Code Playgroud)

我的主要功能非常简单,只调用该函数:

#include "rendering.h"

int main(int argc, char** argv)
{
    InitGL(argc, argv);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此命令进行编译:

g++ -Wall -g swim.cpp rendering.cpp -lglut -lGLU -o swim
Run Code Online (Sandbox Code Playgroud)

正在运行swim按预期创建窗口.但是,如果我取消注释行InitGL,那么在运行程序时会出现分段错误: …

c++ opengl segmentation-fault

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

OpenGL中的CSG建模

我正在处理使用OpenGL进行构造实体几何(CSG)建模.

我想知道如何实现二进制操作.我读了一些关于金羽算法的知识,我知道OpenCSG,但在阅读了它的源代码之后,我觉得它太复杂了.我只需要一个简单的最短OpenGL示例如何实现它.

算法没有限制,只要它易于实现.

opengl graphics modeling csg

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

沿枪执行缩放

我正在制作一些游戏,而且我已经完成了所有游戏,但并没有放大枪的能力,因为我不知道如何设置它.游戏是使用openGL在3D中完成的,所以我想听听你关于如何实现它的建议.如果需要,可以提供代码的片段.

c++ opengl

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

我的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
查看次数

GLSL和glBegin(GL_TRIANGLES)不起作用

此代码仅呈现十二面体并完全忽略该glBegin(GL_TRIANGLES)块:

glutSolidDodecahedron();
glBegin(GL_TRIANGLES);
glNormal3f(1, 0, 0);
glVertex3f(11, 0, 0);
glNormal3f(0, 1, 1);
glVertex3f(-11, 0, 0);
glNormal3f(0, 0, 1);
glVertex3f(0, 0, 11);
glEnd();
Run Code Online (Sandbox Code Playgroud)

这两个着色器非常简单:

顶点着色器:

varying vec3 normal;
void main()
{   
gl_Position = ftransform();
gl_FrontColor = gl_Color;
gl_BackColor = gl_Color;
normal =  gl_Normal;
normal = gl_NormalMatrix  * normal;
}
Run Code Online (Sandbox Code Playgroud)

和碎片:

uniform vec3 lightDir;
varying vec3 normal;
void main()
{
    float intensity = dot(lightDir, normal);
    gl_FragColor =  0.5 * (1.5 + intensity) * gl_Color;
}
Run Code Online (Sandbox Code Playgroud)

虽然glutSolidX函数类型适用于此示例(基于Lightouse3D教程),但如何快速绘制三角形,从一帧到另一帧更改坐标(我尝试了数组和GL_DYNAMIC_DRAW,但与旧的"固定管道"相比,这工作太多了"方法".我看到其他人仍然 …

c++ opengl glsl

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