Anonymous
Как сделать шестиугольник? VS показывает только треугольник
Сообщение
Anonymous » 24 ноя 2024, 07:33
Я пытаюсь создать шестиугольник и изучить тесселяцию, но когда я выполняю все, что вижу, это треугольник.
У меня Nvidia 4080, драйверы обновлены. Я уже проверил библиотеки и думаю, что с ними все в порядке.
Код: Выделить всё
#include
#include
#include
#include
#include
#include
glm::vec3 hexagonPoints[] = {
{0.0f, 0.5f, 0.0f},
{0.433f, 0.25f, 0.0f},
{0.433f, -0.25f, 0.0f},
{0.0f, -0.5f, 0.0f},
{-0.433f, -0.25f, 0.0f},
{-0.433f, 0.25f, 0.0f},
};
GLuint hexagonVBO, hexagonVAO;
const char* vertexShaderSource = R"(
#version 400 core
layout (location = 0) in vec3 aPos;
void main() {
gl_Position = vec4(aPos, 1.0);
}
)";
const char* tessControlShaderSource = R"(
#version 400 core
layout(vertices = 6) out;
void main() {
if (gl_InvocationID == 0) {
gl_TessLevelInner[0] = 1.0;
gl_TessLevelInner[1] = 1.0;
gl_TessLevelOuter[0] = 1.0;
gl_TessLevelOuter[1] = 1.0;
gl_TessLevelOuter[2] = 1.0;
gl_TessLevelOuter[3] = 1.0;
}
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
)";
const char* tessEvalShaderSource = R"(
#version 400 core
layout(triangles) in;
void main() {
gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) +
(gl_TessCoord.y * gl_in[1].gl_Position) +
(gl_TessCoord.z * gl_in[2].gl_Position);
}
)";
const char* fragmentShaderSource = R"(
#version 400 core
out vec4 FragColor;
void main() {
FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
)";
void setupHexagonVAO() {
glGenVertexArrays(1, &hexagonVAO);
glBindVertexArray(hexagonVAO);
glGenBuffers(1, &hexagonVBO);
glBindBuffer(GL_ARRAY_BUFFER, hexagonVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(hexagonPoints), hexagonPoints, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
}
GLuint compileShader(GLenum type, const char* source) {
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &source, nullptr);
glCompileShader(shader);
int success;
char infoLog[512];
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(shader, 512, nullptr, infoLog);
std::cerr
Подробнее здесь: [url]https://stackoverflow.com/questions/79218662/how-can-i-do-an-hexagon-vs-only-shows-a-triangle[/url]
1732422830
Anonymous
Я пытаюсь создать шестиугольник и изучить тесселяцию, но когда я выполняю все, что вижу, это треугольник. У меня Nvidia 4080, драйверы обновлены. Я уже проверил библиотеки и думаю, что с ними все в порядке. [code]#include #include #include #include #include #include glm::vec3 hexagonPoints[] = { {0.0f, 0.5f, 0.0f}, {0.433f, 0.25f, 0.0f}, {0.433f, -0.25f, 0.0f}, {0.0f, -0.5f, 0.0f}, {-0.433f, -0.25f, 0.0f}, {-0.433f, 0.25f, 0.0f}, }; GLuint hexagonVBO, hexagonVAO; const char* vertexShaderSource = R"( #version 400 core layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos, 1.0); } )"; const char* tessControlShaderSource = R"( #version 400 core layout(vertices = 6) out; void main() { if (gl_InvocationID == 0) { gl_TessLevelInner[0] = 1.0; gl_TessLevelInner[1] = 1.0; gl_TessLevelOuter[0] = 1.0; gl_TessLevelOuter[1] = 1.0; gl_TessLevelOuter[2] = 1.0; gl_TessLevelOuter[3] = 1.0; } gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; } )"; const char* tessEvalShaderSource = R"( #version 400 core layout(triangles) in; void main() { gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) + (gl_TessCoord.y * gl_in[1].gl_Position) + (gl_TessCoord.z * gl_in[2].gl_Position); } )"; const char* fragmentShaderSource = R"( #version 400 core out vec4 FragColor; void main() { FragColor = vec4(1.0, 0.0, 0.0, 1.0); } )"; void setupHexagonVAO() { glGenVertexArrays(1, &hexagonVAO); glBindVertexArray(hexagonVAO); glGenBuffers(1, &hexagonVBO); glBindBuffer(GL_ARRAY_BUFFER, hexagonVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(hexagonPoints), hexagonPoints, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); } GLuint compileShader(GLenum type, const char* source) { GLuint shader = glCreateShader(type); glShaderSource(shader, 1, &source, nullptr); glCompileShader(shader); int success; char infoLog[512]; glGetShaderiv(shader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(shader, 512, nullptr, infoLog); std::cerr Подробнее здесь: [url]https://stackoverflow.com/questions/79218662/how-can-i-do-an-hexagon-vs-only-shows-a-triangle[/url]