• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

OpenGL (0) : error C3001: no program defined

Object Storage Arubacloud
0 głosów
294 wizyt
pytanie zadane 17 lipca 2018 w C i C++ przez kolijk Użytkownik (600 p.)

Witam. Korzystam od niedawna z kursu OpenGL. Robię krok po kroku tak jak na kursie, program się kompiluje i uruchamia lecz trójkąt się nie pojawia na ekranie.

 

#include <iostream>

#define GLEW_STATIC

#include <GL/glew.h>

#include <GLFW/glfw3.h>

const GLint WIDTH = 800, HEIGHT = 600;

const GLchar *vertexShaderSource = "#version 330 core\n"
"layout ( location = 0 ) in vec3 position;\n"
"void main ( )\n"
"{\n"
"gl_Position = vec4( position.x, position.y, position.z, 1.0 );\n"
"}";

const GLchar *fragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"void nain( )\n"
"{\n"
"color = vec4 ( 1.0f, 0.5f, 0.2f, 1.0f );\n"
"}";

int main() {

	glfwInit();

	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
	glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

	GLFWwindow * window = glfwCreateWindow(WIDTH, HEIGHT, "Learn OpenGL", nullptr, nullptr);

	int screenWidth, screenHeight;


	glfwGetFramebufferSize(window, &screenWidth, &screenHeight);

	if (nullptr == window) {
		std::cout << "Nieudalo sie utworzyc okna!" << std::endl;
		glfwTerminate();

		return EXIT_FAILURE;
	}

	glfwMakeContextCurrent(window);

	glewExperimental = GL_TRUE;

	if (GLEW_OK != glewInit()) {
		std::cout << "Nieudalo sie zainicjowal GLEW!" << std::endl;
		return EXIT_FAILURE;
	}


	glViewport(0, 0, screenWidth, screenHeight);

	GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
	glCompileShader(vertexShader);

	GLint success;
	GLchar infoLog[512];


	glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

	if (!success) {
		glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
		std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
	}

	GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
	glCompileShader(fragmentShader);

	glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);

	if (!success) {
		glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
		std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << std::endl;
	}

	std::cout << glewGetErrorString(glCreateProgram()) << std::endl;/**//**//**//**/

	GLuint shaderProgram = glCreateProgram();

	glAttachShader(shaderProgram, vertexShader);
	glAttachShader(shaderProgram, fragmentShader);
	glLinkProgram(shaderProgram);

	glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);

	std::cout << success << std::endl;/**//**//**//**/

	if (!success) {//tutaj blad
		glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
		std::cout << "Info log:" << infoLog << std::endl;/**//**//**//**//**/
		std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << std::endl;
	}


	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);
	
	GLfloat vertices[] = {
		-0.5f, -0.5f, 0.0f,
		0.5f, -0.5f, 0.0f,
		0.0f, 0.5f, 0.0f
	};

	GLuint VBO, VAO;
	
	glGenVertexArrays(1, &VAO);
	glGenBuffers(1, &VBO);

	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *)0);
	glEnableVertexAttribArray(0);

	glBindBuffer(GL_ARRAY_BUFFER, 0);

	glBindVertexArray(0);
	


	while (!glfwWindowShouldClose(window)) {
		
		glfwPollEvents();

		glClearColor(0.2, 0.3, 0.3, 1.0);
		glClear(GL_COLOR_BUFFER_BIT);

		glUseProgram(shaderProgram);
		glBindVertexArray(VAO);
		glDrawArrays(GL_TRIANGLES, 0, 3);
		glBindVertexArray(0);
		

		//draw obejcts

		glfwSwapBuffers(window);

	}

	glDeleteVertexArrays(1, &VAO);
	glDeleteBuffers(1, &VAO);

	glfwTerminate();

	return EXIT_SUCCESS;

}

Najprawdopodobniej ta funkcja nie wykonała się poprawnie:

glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);

 

I w konsoli wyskakuje takie coś:

GLX 1.2 and up are not supported
0
Info log:Fragment info
-------------
(0) : error C3001: no program defined

ERROR::SHADER::PROGRAM::LINKING_FAILED

(Te linie kodu gdzie wyświetlam zmienne i funkcje są prze zemnie wstawione) 

 

Nawet aktualizowałem sterowniki karty graficznej ale i tak nic nie pomogło.

1 odpowiedź

+1 głos
odpowiedź 17 lipca 2018 przez criss Mędrzec (172,590 p.)
wybrane 18 lipca 2018 przez kolijk
 
Najlepsza
W fragment shader masz `nain` zamiast `main`. Domyślną nazwą entry point jest `main`, dlatego nie wiadomo co ma się wykonać jako FS, bo nie ma u ciebie funkcji main.
komentarz 17 lipca 2018 przez kolijk Użytkownik (600 p.)

Teraz po poprawce już tego nie ma lecz trójkąta nadal jak nie było tak nie ma.

W kodzie jest taka linijka:

std::cout << glewGetErrorString(glCreateProgram())

która wyświetla to:

GLX 1.2 and up are not supported

To ma jakiś zwiąek z tym że trójkąta nie ma?

komentarz 18 lipca 2018 przez criss Mędrzec (172,590 p.)
Co do tego "GLX 1.2 and up..." niestety nie wiem. Pewnie jesteś na linuksie? Linkujesz glx.so?

Druga sprawa - przed glVertexAttribPointer musisz zabindować vao (glBindVertexArray(VAO);), żeby vertex attrib array został zapisany w vao state.
komentarz 18 lipca 2018 przez criss Mędrzec (172,590 p.)
Poza tym... czemu właściwie ma służyć glewGetErrorString(glCreateProgram())?

glewGetErrorString podobno przyjmuje kod błędu i na jego podstawie generuje error string. glCreateProgram tworzy shader program i zwraca jego ID. Wywal cały ten cout, bo to nie ma żadnego sensu. IMO po prostu wyświetliłeś randomowy (odpowiadający liczbie którą wygenerował OpenGL) error string.
komentarz 18 lipca 2018 przez kolijk Użytkownik (600 p.)
Dzięki. Już działa jak dopisałem glBindVertexArray(VAO);. Musiałem w kursie nie zauważyć tej linijki

 

 

PS.W ogóle to działam na windowsie.
komentarz 18 lipca 2018 przez criss Mędrzec (172,590 p.)
Jak już pewnie wiesz, vao służy do zapisywania ustawień vertex attribs (bindingi bufferów pod vertex attributes) i index buffera, żeby nie musieć wykonywać tych calli za każdym razem, tylko zabindować vao. U ciebie jest tylko jedno takie ustawienie, więc możesz w ogóle pozbyć się vao, a zostawić tylko calle do glVertexAttribPointer oraz glEnableVertexAttribArray tam gdzie są teraz.

Podobne pytania

0 głosów
1 odpowiedź 2,900 wizyt
pytanie zadane 16 stycznia 2016 w JavaScript przez KapiziaK Użytkownik (900 p.)
0 głosów
2 odpowiedzi 1,008 wizyt
pytanie zadane 22 kwietnia 2016 w C i C++ przez kkkk Nowicjusz (170 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...