gpt4 book ai didi

c++ - 尝试渲染像素坐标时,简单的线条渲染失败

转载 作者:行者123 更新时间:2023-12-02 10:15:50 25 4
gpt4 key购买 nike

很抱歉在这里携带这个,但是我花了大约7个小时来做​​一件非常简单的事情。也许有些人发现了问题。

我尝试在屏幕上渲染一些像素坐标。代码如下。

对于800x600的屏幕。只需尝试计算线条的位置,然后将其渲染到屏幕即可。

例如:点A(400,300,0)和点B(500,300,0)应该是从屏幕中心到右侧的简单黑线。

当我在render中调用此类函数时,我以为可能正在创建一个单独的渲染 session 。但是,当我编写诸如glCleanColor之类的东西时,背景会改变。


#include <GLFW/glfw3.h>
#include <GL/gl.h>
#include <GL/glew.h>

#include <iostream>
#include <vector>


顶点着色器:
const GLchar *vertex_shader =
"#version 410\n"
"layout (location = 0) in vec3 pos;\n"
"layout (location = 1) in vec4 col;\n"
"uniform mat4 projection;\n"
"out vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" Frag_Color = col;\n"
" gl_Position =projection*vec4(pos.xyz,1);\n"
"}\n";

片段着色器:
const GLchar *fragment_shader =
"#version 410\n"
"in vec4 Frag_Color;\n"
"layout (location = 0) out vec4 Out_Color;\n"
"void main()\n"
"{\n"
" Out_Color = Frag_Color;\n"
"}\n";

顶点结构
struct Vrtx
{
float pos[3];
float col[4] = {0.0f, 0.0f, 0.0f, 1.0f};
};

坐标轴类:
class CoordinateAxis
{
public:
void coordinate_axis()
{
vertices.resize(6);
for (int i = 0; i < 3; i++)
{
vertices[2 * i].pos[0] = 400;
vertices[2 * i].pos[1] = 300;
vertices[2 * i].pos[2] = 0;
}
vertices[1].pos[0] = 500;
vertices[1].pos[1] = 300;
vertices[1].pos[2] = 0;
vertices[3].pos[0] = 400;
vertices[3].pos[1] = 400;
vertices[3].pos[2] = 0;
vertices[3].pos[0] = 400;
vertices[3].pos[1] = 430;
vertices[3].pos[2] = 100;

setupRender();
glBindVertexArray(VAO);
glDrawElements(GL_LINE, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
glUseProgram(0);
}
CoordinateAxis()
{
initShaderProgram();
};

private:
void initShaderProgram()
{
// Vertex shader
GLuint vHandle = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vHandle, 1, &vertex_shader, NULL);
glCompileShader(vHandle);

// Fragment shader
GLuint fHandle = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fHandle, 1, &fragment_shader, NULL);
glCompileShader(fHandle);

// Create Program
handleProgram = glCreateProgram();
glAttachShader(handleProgram, vHandle);
glAttachShader(handleProgram, fHandle);
glLinkProgram(handleProgram);

attribLocationProj = glGetUniformLocation(handleProgram, "projection");

glGenVertexArrays(1, &VAO);
// CreateBuffers
glGenBuffers(1, &vboHandle);
glGenBuffers(1, &iboHandle);
}
void setupRender()
{
GLint last_viewport[4];
glGetIntegerv(GL_VIEWPORT, last_viewport);
float L = last_viewport[0];
float R = L + last_viewport[2];
float B = last_viewport[1];
float T = B + last_viewport[3];

const float ortho_projection[4][4] =
{
{2.0f / (R - L), 0.0f, 0.0f, 0.0f},
{0.0f, 2.0f / (T - B), 0.0f, 0.0f},
{0.0f, 0.0f, -1.0f, 0.0f},
{(R + L) / (L - R), (T + B) / (B - T), 0.0f, 1.0f},
};
glUseProgram(handleProgram);
glUniformMatrix4fv(attribLocationProj, 1, GL_FALSE, &ortho_projection[0][0]);
glBindVertexArray(VAO);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboHandle);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, vboHandle);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vrtx), vertices.data(), GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, vboHandle);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertices.size() * sizeof(Vrtx), 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, vertices.size() * sizeof(Vrtx), (void *)(3 * sizeof(float)));

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
}

std::vector<Vrtx> vertices;
std::vector<GLuint> indices;
GLuint handleProgram, VAO, vboHandle, iboHandle, attribLocationProj;
};

最佳答案

GL_LINE不是有效的原始类型。 GL_LINE glPolygonMode 的模式。
有效的line primitive类型是GL_LINES:
glDrawElements(GL_LINE, 6, GL_UNSIGNED_INT, 0);

glDrawElements(GL_LINES, 6, GL_UNSIGNED_INT, 0);

此外,当您通过 glVertexAttribPointer 设置顶点属性数据数组时,会出现问题。第5个参数(strid)是连续属性元组之间的字节偏移量,而不是缓冲区的大小。 sizeof(Vrtx)而不是 vertices.size() * sizeof(Vrtx):

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vrtx), 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vrtx), (void *)(3*sizeof(float)));

注意,索引数组似乎为空。要么初始化索引数组:

indices = { 0, 1, 2, 3, 4, 5 };

或改用 glDrawArrays :

glDrawArrays(GL_LINES, 0, 6);

关于c++ - 尝试渲染像素坐标时,简单的线条渲染失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61990187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com